欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 Springboot整合token进行权限校验代码实战

程序员文章站 2022-06-21 13:30:38
在pom.xml文件中导入maven依赖 io.jsonwebtoken jjwt 0.6.0创建token的案例package com.example....

在pom.xml文件中导入maven依赖

<!-- jjwt -->
<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.6.0</version>
</dependency>

创建token的案例

package com.example.demo.create;

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * @author shiwen
 * @date 2020/7/15
 */
public class CreateJwt {

    public static void main(String[] args) {
        // 创建jwt
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId("6666")
                .setSubject("userName")
                // new Date()是当前时间
                .setIssuedAt(new Date())
                // 荷载 + 头 + 严 => signWith就是签证
                .signWith(SignatureAlgorithm.HS256, "adams")
                // 设置过期时间(单位:毫秒):1小时
                .setExpiration(new Date(new Date().getTime() + 3600000))
                .claim("roles", "yangshiwen");

        // 输出测试 - 输出签名(头 + 荷载 + 严)
        System.out.println(jwtBuilder.compact());
    }

}

解析token的案例

package com.example.demo.parse;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

import java.text.SimpleDateFormat;

/**
 * @author shiwen
 * @date 2020/7/15
 */
public class ParseJwt {

    public static void main(String[] args) {
        // 获取token
        Claims claims = Jwts.parser()
                .setSigningKey("adams")        // 严
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyNSIsInN1YiI6IuadqOS4luaWhyIsImlhdCI6MTU5NDgxOTgyNiwicm9sZXMiOiLlrabnlJ8m5byA5Y-RIiwiZXhwIjoxNTk0ODIzNDI2fQ._eBhU8pY3IMAN9MZs6ziW0Pc0dzKI9w1UPQko4qpO88")        // 签名
                .getBody();
        // 获取设置的id
        System.out.println("用户id:" + claims.getId());
        // 获取设置保存的内容
        System.out.println("用户名:" + claims.getSubject());
        // 获取登录时间,转换为SimpleDateFormat的格式
        System.out.println("登录时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getIssuedAt()));
        // 获取过期时间
        System.out.println("有效时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getExpiration()));
        // 获取自定义的数据内容,这里可以获取value
        System.out.println("角色:" + claims.get("roles"));
    }

}

权限校验实战案例

token工具类
package com.example.demo.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Date;

/**
 * jwt工具类
 *
 * @author shiwen
 * @date 2020/7/15
 */
@ConfigurationProperties("jwt.config")
public class JwtUtil {

    private String key;

    // 一个小时,从现在开始算 tt1 后过期
    private Long tt1;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public Long getTt1() {
        return tt1;
    }

    public void setTt1(Long tt1) {
        this.tt1 = tt1;
    }

    /**
     * 根据【用户id、设置的值、角色】生成token
     */
    public String createJWT(String id, String subject, String roles) {
        // 当前时间戳
        Long nowMillis = System.currentTimeMillis();
        // 将时间戳改为当前时间
        Date now = new Date(nowMillis);
        System.out.println("当前时间:" + now);
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(id)                                      // 登录用户id
                .setSubject(subject)                            // 用户信息
                .setIssuedAt(now)                               // 登录时间
                .signWith(SignatureAlgorithm.HS256, key)        // 哈希256算法 & 严
                .claim("roles", roles);                       // 角色定义 key-value
        if (tt1 > 0) {
            // 设置过期时间 = 当前时间 + tt1
            jwtBuilder.setExpiration(new Date(nowMillis + tt1));
        }
        // 生产签名
        return jwtBuilder.compact();
    }

    /**
     * 根据签名解析jwt
     */
    public Claims parseJWT(String jwtStr) {
        return Jwts.parser()
                .setSigningKey(key)                               // 获取严
                .parseClaimsJws(jwtStr)                           // 解析签名
                .getBody();
    }

}
yml文件
jwt:
  config:
    # 严
    key: adams
    # 设置过期时间 = 1小时,这里是以毫秒为单位的,1000 * 60 * 60
    tt1: 3600000

server:
  port: 8080
  servlet:
    context-path: /jwt
启动文件放一个token工具类的bean进去
package com.example.demo;

import com.example.demo.util.JwtUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    /**
     * 将对象扔入容器
     */
    @Bean
    public JwtUtil jwtUtil() {
        return new JwtUtil();
    }

}
controller层
package com.example.demo.controller;

import com.example.demo.util.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author shiwen
 * @date 2020/7/15
 */
@RestController
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 通过request获取请求头
     */
    @Autowired
    private HttpServletRequest request;

    @GetMapping("/login")
    public Map login(String id, String subject, String roles){
        String token = jwtUtil.createJWT(id, subject, roles);
        Map<String, Object> map = new HashMap<>();
        // 登录直接返回签名
        map.put("token", token);
        map.put("roles", roles);
        return map;
    }

    @GetMapping("/isAdmin")
    public String isAdmin(){
        String header = request.getHeader("Authorization");
        // 判断是否为空
        if (header == null || "".equals(header)) {
            // throw new RuntimeException("权限不足");
            return "权限不足";
        }
        if (!header.startsWith("Bearer ")) {
            return "权限不足";
        }
        // 得到token令牌
        String token = header.substring(7);
        try {
            // 解析令牌
            Claims claims = jwtUtil.parseJWT(token);
            String roles = (String) claims.get("roles");
            // 判断roles是否为空或者roles角色是否为admin
            if (!"admin".equals(roles) || roles == null) {
                return "权限不足";
            }
        } catch (Exception e) {
            return "权限不足";
        }
        return "是管理员";
    }

    @GetMapping("/isAdminBetter")
    public String isAdminBetter(){
        String header = request.getHeader("token");
        // 判断是否为空,如果请求token为空的话直接权限不足
        if (header == null || "".equals(header)) {
            return "权限不足";
        }
        // 得到token令牌,这里获取的是value的值,而不是key的值,比如:token:adewbvcbcs.adazccz.rnbgfdch的话,就是获取value的值
        String token = header;
        try {
            // 解析令牌
            Claims claims = jwtUtil.parseJWT(token);
            // 获取存储在claims中的角色roles
            String roles = (String) claims.get("roles");
            // 判断roles是否为空或者roles角色是否为admin
            if (!"admin".equals(roles) || roles == null) {
                return "权限不足";
            }
        } catch (Exception e) {
            return "权限不足";
        }
        return "是管理员";
    }

}

请求方式:

第一种:

荐
                                                        Springboot整合token进行权限校验代码实战

第二种:

荐
                                                        Springboot整合token进行权限校验代码实战

校验成功

荐
                                                        Springboot整合token进行权限校验代码实战

本文地址:https://blog.csdn.net/qq_43097201/article/details/107377327