荐 Springboot整合token进行权限校验代码实战
程序员文章站
2022-03-03 12:25:24
在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 "是管理员";
}
}
请求方式:
第一种:
第二种:
校验成功
本文地址:https://blog.csdn.net/qq_43097201/article/details/107377327
上一篇: 三人斗地主(for循环,Map集合,list集合)
下一篇: 后台小白java笔记