如何在Springboot中使用Spring Security实现一个JWT认证

  介绍

这期内容当中小编将会给大家带来有关如何在Springboot中使用Spring Security实现一个JWT认证,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1简介

Spring Security作为成熟且强大的安全框架,得到许多大厂的青睐。而作为前后端分离的SSO方案,JWT也在许多项目中应用。本文将介绍如何通过Spring Security实现JWT认证。

用户与服务器交互大概如下:

如何在Springboot中使用Spring Security实现一个JWT认证

<李>

客户端获取JWT,一般通过发布方法把用户名/密码传给服务器;

<李>

服务端接收到客户端的请求后,会检验用户名/密码是否正确,如果正确则生成JWT并返回;不正确则返回错误;

<李>

客户端拿到JWT后,在有效期内都可以通过JWT来访问资源了,一般把JWT放在请求头;一次获取,多次使用;

<李>

服务端校验JWT是否合法,合法则允许客户端正常访问,不合法则返回401。

2项目整合

我们把要整合的Spring Security和智威汤逊加入到项目的依赖中去:

& lt; dependency>   ,& lt; groupId> org.springframework.boot   ,& lt; artifactId> spring-boot-starter-web   & lt;/dependency>   & lt; dependency>   ,& lt; groupId> org.springframework.boot   ,& lt; artifactId> spring-boot-starter-security   & lt;/dependency>   & lt; dependency>   ,& lt; groupId> io.jsonwebtoken   ,& lt; artifactId> jjwt   ,& lt; version> 0.9.1   & lt;/dependency>

2.1 JWT整合

2.1.1 JWT工具类

JWT工具类起码要具有以下功能:

<李>

根据用户信息生成JWT;

<李>

校验JWT是否合法,如是否被篡改,是否过期等;

<李>

从智威汤逊中解析用户信息,如用户名,权限等;

具体代码如下:

@ component   public  class  JwtTokenProvider  {      ,@Autowired  JwtProperties  jwtProperties;      ,@ autowired   ,private  CustomUserDetailsService  userDetailsService;      ,private  String  secretKey;      ,@PostConstruct   ,protected  void  init (), {   时间=secretKey 才能;Base64.getEncoder () .encodeToString (jwtProperties.getSecretKey () .getBytes ());   ,}      ,public  String  createToken (String 用户名,List,角色),{      Claims 才能;Claims =, Jwts.claims () .setSubject(用户名);   claims.put才能(“roles",,角色);      Date 才能;你=,new 日期();   Date 才能;validity =, new 日期(now.getTime (), +, jwtProperties.getValidityInMs ());      return 才能Jwts.builder ()//,,,.setClaims(声称)//,,,.setIssuedAt(现在)//,,,.setExpiration(有效性)//,,,.signWith (SignatureAlgorithm.HS256, secretKey)//,,,.compact ();   ,}      ,public  Authentication  getAuthentication (String 令牌),{   UserDetails 才能;UserDetails =, this.userDetailsService.loadUserByUsername (getUsername(令牌));   return 才能;new  UsernamePasswordAuthenticationToken (userDetails,,,,,, userDetails.getAuthorities ());   ,}      ,public  String  getUsername (String 令牌),{   return 才能;Jwts.parser () .setSigningKey (secretKey) .parseClaimsJws(令牌).getBody () .getSubject ();   ,}      ,public  String  resolveToken (HttpServletRequest 要求),{   String 才能;bearerToken =, req.getHeader (“Authorization");   if 才能;(bearerToken  !=, null ,,, bearerToken.startsWith (“Bearer “)), {   ,,return  bearerToken.substring (7);   ,,}   return 才能;零;   ,}      ,public  boolean  validateToken (String 令牌),{   try {才能   ,,Jws如何在Springboot中使用Spring Security实现一个JWT认证