SpringBoot集成Spring Security用JWT令牌实现登录和鉴权 [ 附源码 ]

本文介绍了如何在SpringBoot项目中使用Spring Security和JWT进行用户登录及鉴权。首先解释JWT的基本概念,包括JWT的组成和校验流程。接着详细讲解了项目配置,包括导入依赖、实体类、Utils工具类、UserDetailsService实现、两个拦截器(JWTAuthenticationFilter和JWTAuthorizationFilter)的设置,以及自定义无权限处理类。最后,提供了一个简单的对外接口示例,并提醒实际开发中要注意密码加密和使用Redis存储Token等细节。
摘要由CSDN通过智能技术生成

最近在做项目的过程中 需要用JWT做登录和鉴权 查了很多资料 都不甚详细
有的是需要在application.yml里进行jwt的配置 但我在导包后并没有相应的配置项 因而并不适用
在踩过很多坑之后 稍微整理了一下 做个笔记

一、概念

1、什么是JWT

Json Web Token (JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)
该token被设计为紧凑且安全的 特别适用于分布式站点的单点登录(SSO)场景

随着JWT的出现 使得校验方式更加简单便捷化
JWT实际上就是一个字符串 它由三部分组成:头部 载荷签名
用[.]分隔这三个部分 最终的格式类似于:xxxx.xxxx.xxxx

在服务器直接根据token取出保存的用户信息 即可对token的可用性进行校验 使得单点登录更为简单

2、JWT校验的过程

  • 1、浏览器发送用户名和密码 发起登录请求
  • 2、服务端验证身份 根据算法将用户标识符打包生成token字符串 并且返回给浏览器
  • 3、当浏览器需要发起请求时 将token一起发送给服务器
  • 4、服务器发现数据中携带有token 随即进行解密和鉴权
  • 5、校验成功 服务器返回请求的数据

二、使用

1、首先是导包

<!-- Spring Security -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- Spring Security和JWT整合 -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-jwt</artifactId>
	<version>1.0.10.RELEASE</version>
</dependency>

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

<!-- 字符串转换需要用到此包 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.4</version>
</dependency>

2、实体类

两个实体类 一个是用户 另一个是权限

public class User {
   
    private Integer id;
    private String username;
    private String password;
    
	省略gettersetter之类的代码...
}
public class Role {
   
    private Integer id;
    private String username;
    private String name;
    
	省略gettersetter之类的代码...
}

3、然后需要一个Utils工具类

该类用于进行Token的加密和解密 可在此类中单元测试

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

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTokenUtil {
   
    // Token请求头
    public static final String TOKEN_HEADER = "Authorization";
    // Token前缀
    public static final String TOKEN_PREFIX = "Bearer ";

    // 签名主题
    public static final String SUBJECT = "piconjo";
    // 过期时间
    public static final long EXPIRITION = 1000 * 24 * 60 * 60 * 7;
    // 应用密钥
    public static final String APPSECRET_KEY = "piconjo_secret";
    // 角色权限声明
    private static final String ROLE_CLAIMS = "role";
    
    /**
     * 生成Token
     */
    public static String createToken(String username,String role) {
   
        Map<String,Object> map = new HashMap<>();
        map.put(ROLE_CLAIMS, role);

        String token = Jwts
                .builder()
                .setSubject(username)
                .setClaims(map)
                .claim("username",username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRITION))
                .signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact();
        return token;
    }

    /**
     * 校验Token
     */
    public static Claims checkJWT(String token) {
   
        try {
   
            final Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody();
            return claims;
        
  • 15
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值