SpringBoot + Shiro + JWT 实现认证和授权

本文详细介绍了如何使用SpringBoot、Shiro和JWT来实现认证和授权功能。首先解释了JWT的基本原理和组成,然后展示了SpringBoot项目中集成Shiro和JWT的步骤,包括创建JWT工具类、设置Shiro配置、定义过滤器以及控制器层的权限注解。通过实际的代码示例和测试用例,展示了用户如何通过登录获取JWT token,并使用该token进行不同级别的权限访问。
摘要由CSDN通过智能技术生成

1、JWT

JWT是JSON WEB TOKEN的缩写,它是基于 RFC 7519标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。

1.JWT的组成

  • JWT token的格式:header.payload.signature
  • header中用于存放签名的生成算法 {"alg": "HS512"}
  • payload中用于存放用户名、token的生成时间和过期时间{"sub":"admin","created":1489079981393,"exp":1489684781}
  • signature为以header和payload生成的签名,一旦header和payload被篡改,验证将失败
    //secret为加密算法的密钥 String signature = HMACSHA512(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

2.JWT实现认证和授权的原理

  • 用户调用登录接口,登录成功后获取到JWT的token;
  • 之后用户每次调用接口都在http的header中添加一个叫Authorization的头,值为JWT的token;
  • 后台程序通过对Authorization头中信息的解码及数字签名校验来获取其中的用户信息,从而实现认证和授权。

2、SpringBoot + Shiro + JWT 实现认证和授权

  1. 项目结构

在这里插入图片描述
2. 开发环境及导入相关maven依赖

  • IDEA:2018.2(lombok插件)
  • SpringBoot:2.3.1.RELEASE
  • Shiro:1.4.1
  • JWT:3.2.0
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
  1. 集成JWT
  • JwtUti
    利用 JWT 的工具类来生成token。这个工具类有生成 token 和 校验 token 以及从token中获取信息
@Slf4j
public class JwtUtil {
   

    private static final Long EXPIRE_TIME = 5 * 60 * 1000L;

    private static final String SECRET = "SHIRO+JWT";

    /**
     * 生成 token 时,指定 token 过期时间 EXPIRE_TIME 和签名密钥 SECRET,
     * 然后将 expireDate 和 username 写入 token 中,并使用带有密钥的 HS256 签名算法进行签名
     * @param username
     * @return
     */
    public static String createToken(String username) {
   
        String token = null;
        try {
   
            // 过期时间
            Date expireDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            // 加密算法
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            token = JWT.create()
                    .withClaim("username", username)
                    .withExpiresAt(expireDate)
                    .sign(algorithm);
        } catch (UnsupportedEncodingException e) {
   
            log.error("Failed to create token. {}", e.getMessage());
        }
        return token;
    }

    /**
     * 验证token,如果验证失败,便会抛出异常
     * @param token
     * @param username
     * @return
     */
    public static boolean verify(String token, String username) {
   
        boolean isSuccess = false;
        try {
   
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("username", username)
                    .build
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值