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

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


<dependency>
      <groupId>io.jsonwebtokengroupId>
      <artifactId>jjwtartifactId>
      <version>0.6.0version>
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进行权限校验代码实战_第1张图片

校验成功

在这里插入图片描述

你可能感兴趣的:(SpringBoot,Token)