小程序(二)shiro+jwt登录认证

这篇具有很好参考价值的文章主要介绍了小程序(二)shiro+jwt登录认证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、Shiro和JWT技术

Shiro是Java领域非常知名的认证( Authentication )与授权
( Authorization )框架,用以替代JavaEE中的JAAS功能。相
较于其他认证与授权框架,Shiro设计的非常简单,所以广受好
评。任意JavaWeb项目都可以使用Shiro框架,而Spring Security
必须要使用在Spring项目中。所以Shiro的适用性更加广泛。像什
么 JFinal 和 Nutz 非Spring框架都可以使用Shiro,而不能使用Spring Security框架。


1、Shiro简介

什么是认证?
认证就是要核验用户的身份,比如说通过用户名和密码来检验用户的身份。说简单一些,认证就
是登陆。登陆之后Shiro要记录用户成功登陆的凭证。

什么是授权?
授权是比认证更加精细度的划分用户的行为。比如说一个教务管理系统中,学生登陆之后只能查
看信息,不能修改信息。而班主任就可以修改学生的信息。这就是利用授权来限定不同身份用户
的行为。

Shiro靠什么做认证与授权?
Shiro可以利用 HttpSession 或者 Redis 存储用户的登陆凭证,以及角色或者身份信息。然后利
用过滤器(Filter),对每个Http请求过滤,检查请求对应的 HttpSession 或者 Redis 中的认证
与授权信息。如果用户没有登陆,或者权限不够,那么Shiro会向客户端返回错误信息。
也就是说,我们写用户登陆模块的时候,用户登陆成功之后,要调用Shiro保存登陆凭证。然后查
询用户的角色和权限,让Shiro存储起来。将来不管哪个方法需要登陆访问,或者拥有特定的角色
跟权限才能访问,我们在方法前设置注解即可,非常简单。

2、JWT简介

JWT(Json Web Token), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标
准。JWT一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服
务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用
于认证,也可被加密。
小程序(二)shiro+jwt登录认证
JWT可以用在单点登录的系统中:
传统的 JavaWeb 项目,利用 HttpSession 保存用户的登陆凭证。如果后端系统采用了负载均衡
设计,当用户在A节点成功登陆,那么登陆凭证保存在A节点的 HttpSession 中。如果用户下一
个请求被负载均衡到了B节点,因为B节点上面没有用户的登陆凭证,所以需要用户重新登录,
这个体验太糟糕了。
小程序(二)shiro+jwt登录认证
如果用户的登陆凭证经过加密( Token )保存在客户端,客户端每次提交请求的时候,把
Token 上传给后端服务器节点。即便后端项目使用了负载均衡,每个后端节点接收到客户端上传
的Token之后,经过检测,是有效的 Token ,于是就断定用户已经成功登陆,接下来就可以提供
后端服务了。
小程序(二)shiro+jwt登录认证
JWT兼容更多的客户端:
传统的 HttpSession 依靠浏览器的 Cookie 存放 SessionId ,所以要求客户端必须是浏览器。现
在的JavaWeb系统,客户端可以是浏览器、APP、小程序,以及物联网设备。为了让这些设备都
能访问到JavaWeb项目,就必须要引入JWT技术。JWT的 Token 是纯字符串,至于客户端怎么
保存,没有具体要求。只要客户端发起请求的时候,附带上 Token 即可。所以像物联网设备,我
们可以用 SQLite 存储 Token 数据

二、创建JWT工具类

JWT的 Token 要经过加密才能返回给客户端,包括客户端上传的 Token ,后端项目需要验证核
实。于是我们需要一个JWT工具类,用来 加密Token 和 验证Token 的有效性。

1、导入依赖库

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!--shiro-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!--hutool jar-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.0.7</version>
        </dependency>

        <!--考虑到Hutool的非强制依赖性,因此zxing需要用户自行引入-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.0</version>
        </dependency>

2、定义密钥和过期时间

我建议大家把密钥和过期时间定义到SpringBoot配置文件中,然后再值注入到JavaBean中,这样
维护起来比较方便。文章来源地址https://www.toymoban.com/news/detail-498952.html

WeChatMiNi:
  jwt:
    #密钥
    secret: buba123456
    #令牌期时间
    expire: 7
    #令牌缓存时间(天)
    cache-expire: 10

3、创建JWT工具类

package com.buba.wechatmini.common.utils;

/**
 * @author qlx
 */


import com.buba.wechatmini.exception.WechatminiException;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.util.Date;

@Component
@Slf4j
public class JwtUtil {
   
    //密钥
    @Value("${WeChatMiNi.jwt.secret}")
    private String secret;
    //过期时间(天)
    @Value("${WeChatMiNi.jwt.expire}")
    private int expire;

    public String createToken(int userId) throws UnsupportedEncodingException {
   
//         @param date 基准日期
//         @param dateField 偏移的粒度大小(小时、天、月等){@link DateField}
//         @param offset 偏移量,正数为向后偏移,负数为向前偏移
//         @return 偏移后的日期
        Date date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR,expire).toJdkDate();
        Algorithm algorithm = Algorithm.HMAC256(secret); //创建加密算法对象
        JWTCreator.Builder builder = JWT.create();
        String token = builder.withClaim("userId",userId).withExpiresAt(date).sign(algorithm);
        return token;
    }
    public int getUserId(String token) {
   
        try {
   
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("userId").asInt();
        } catch (Exception e) {
   
            thr

到了这里,关于小程序(二)shiro+jwt登录认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SSM+Shiro安全框架整合(完成安全认证--登录+权限授权)+ssm整合shiro前后端分离

    目录 1.搭建SSM框架  1.1.引入相关的依赖 1.2. spring配置文件 1.3. web.xml配置文件 1.4.配置Tomcat并启动 2.ssm整合shiro---认证功能  (1).引入依赖 (2).修改spring配置文件 (3).修改web.xml文件 (4).新建login.jsp(登录页面) (5).新建success.jsp(登录成功后跳转到此) (6).创建User实体类 (7).创建LoginVo

    2024年02月15日
    浏览(46)
  • 快速开发微信小程序之一登录认证

    记得11、12年的时候大家一窝蜂的开始做客户端Android、IOS开发,我是14年才开始做Andoird开发,干了两年多,然后18年左右微信小程序火了,我也做了两个小程序,一个是将原有牛奶公众号的功能迁移到小程序,用户体验得到极大的提升,另外一个是给XX做的一个简单的卖蜂蜜的

    2024年02月06日
    浏览(34)
  • springboot整合shiro+jwt+redis详解

    三大核心组件:Subject、SecurityManager、Realm Subject 主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManag

    2023年04月09日
    浏览(46)
  • 支付宝小程序获取用户授权并进行认证登录流程(前端)

    1.1申请获取用户信息能力     登录功能做之前要先沟通好客户的需求,支付宝小程序获取用户授权调用相应的接口之前要先获得对应的能力。如果需要获取身份证号、手机号、姓名,则需要登录支付宝开放平台,登录企业账号后,在控制台–能力管理–添加“获取会员信

    2024年02月11日
    浏览(57)
  • shiro(一):shiro基本概念及基本使用(认证、授权)

    1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对 用户访问系统的控制 ,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户 身份认证 和 授权 两部分,简称认

    2024年02月03日
    浏览(36)
  • Shiro + JWT + Spring Boot Restful 简易教程

    GitHub 项目地址:github.com/Smith-Cruis… 。 原文地址:www.inlighting.org/archives/sp…。 我也是半路出家的人,如果大家有什么好的意见或批评,请务必 issue 下。 如果想要直接体验,直接 clone 项目,运行 mvn spring-boot:run 命令即可进行访问。网址规则自行看教程后面。 如果想了解 Sp

    2024年01月19日
    浏览(42)
  • 请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能

    会话管理(Session Management):Shiro能够管理用户的会话状态,包括会话的创建、维护和销毁。它支持多种会话存储方式(如内存、数据库等),并提供了会话超时、会话失效等机制,以确保会话的安全性。 跨平台集成:Shiro不仅适用于Web应用程序,还可以轻松集成到桌面应用

    2024年04月13日
    浏览(60)
  • 请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能?

    请简单介绍一下Shiro框架是什么? Shiro框架是一个强大且灵活的开源安全框架,为Java应用程序提供了全面的安全解决方案。它主要用于身份验证、授权、加密和会话管理等功能,可以轻松地集成到任何Java Web应用程序中,并提供了易于理解和使用的API,使开发人员能够快速实

    2024年04月11日
    浏览(58)
  • shiro安全认证之FilterChainDefinitionMap

    最近在用shiro实现安全认证功能时发现一个问题 上图我们定义了一个LinkedHashMap,并往Map里面添加了两对键值对,然后执行  之后在将这两个键值对里面的值进行修改,但是没有执行上面的set操作,debug时发现,虽然没有执行set操作,但是FilterChainDefinitionMap里面的filterMap的键值

    2024年02月14日
    浏览(43)
  • C#窗体程序连接SQL Server数据库实现账号登录、账号注册、修改密码、账号注销和实名认证(不定时更新)

    这是本人用Visual Studio2019做的一个C#窗体登录程序,如标题所示,它包含了账号登录、注册账号、修改密码、注销账号和实名认证五个功能。对于有一定基础知识的小伙伴来说,应该不算太难,里面有注释说明,可能咋一看感觉代码运行的逻辑有点乱,不过没关系,相信对你会

    2024年02月02日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包