详解基于JWT的springboot权限验证技术实现攻略
前言
本篇攻略将讲解基于JWT身份验证技术实现SpringBoot权限验证的具体流程。JWT(Json Web Token)是一种跨域身份验证方式,它将一些基本的身份信息以Json格式的数据段形式加密成一个字符串,比如在大型网站的前后端分离架构中JWT技术被广泛应用。
JWT的优势
JWT作为一种跨域身份验证方式,有以下几个优势:
- 纯前端实现
- 无状态,可扩展
- 安全性高,不需要暴露密码等敏感信息
JWT实现原理
JWT实现原理如下:
- 用户登录时,服务器将用户的标识(用户名或用户ID等信息)加密生成一个Token,并返回给用户。
- 用户在随后的请求中都需要携带这个Token。
- 服务器通过验证Token来识别用户身份。
- 在Token中加入有效期限制,可以使Token在过期前失效,增加了安全性。
实现步骤
以下将介绍具体实现步骤,包括环境搭建、依赖导入、JWT Token加密、权限验证等等。
环境搭建
在本地安装好JDK后,可以使用如下命令初始化一个SpringBoot项目:
$ curl https://start.spring.io/starter.zip \
-d dependencies=web,devtools \
-d javaVersion=11 \
-d type=maven-project \
-d packaging=jar \
-o myproject.zip
执行如下命令解压缩myproject.zip包:
$ unzip myproject.zip -d myproject
进入myproject文件夹并打开项目环境,即可开始进行项目开发。
依赖导入
在pom.xml文件中添加如下依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
JWT Token加密
在该项目中,使用JwtBuilder方法进行Token加密。
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtils {
private static final String SECRET_KEY = "your-secret-key";
public static String generateToken(String subject, long ttlMillis) {
if (ttlMillis <= 0) {
throw new RuntimeException("expiration time must be greater than 0.");
}
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
byte[] secretKeyBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY)
JwtBuilder builder = Jwts.builder()
.setId(UUID.randomUUID().toString())
.setSubject(subject)
.setIssuedAt(now)
.signWith(SignatureAlgorithm.HS256, secretKeyBytes);
if (ttlMillis > 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
return builder.compact();
}
}
权限验证
在该示例中使用JwtParser方法进行Token验证。
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
public class JwtUtils {
private static final String SECRET_KEY = "your-secret-key";
public static Claims parseJwtToken(String token) {
try {
byte[] secretKeyBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY)
Claims claims = Jwts.parser()
.setSigningKey(secretKeyBytes)
.parseClaimsJws(token)
.getBody();
return claims;
} catch (Exception e) {
// handle token validation exception
return null;
}
}
}
以上就是JWT实现SpringBoot权限验证的详细流程。在实现过程中需要注意保证安全性,使用合适秘钥+算法加密,并设置Token有效期限制等。
示例
示例1:使用JWT实现用户登录
在用户登录接口中调用JwtUtils.generateToken方法生成Token,将Token返回给前端。
@PostMapping("/login")
public ResponseEntity<Map<String, String>> login(@RequestBody LoginForm loginForm) {
// ... user login logic
String token = JwtUtils.generateToken(subject, ttlMillis);
Map<String, String> response = new HashMap<>();
response.put("token", token);
return ResponseEntity.ok().body(response);
}
示例2:使用JWT实现接口权限控制
使用Spring Security实现接口权限控制,判断请求中的Authorization头部是否包含JWT Token。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/v1/public/**").permitAll()
.antMatchers("/api/v1/private/**").authenticated()
.and().addFilterBefore(new JwtTokenFilter(),
UsernamePasswordAuthenticationFilter.class);
}
}
JwtTokenFilter继承OncePerRequestFilter并重写doFilterInternal方法进行Token验证和权限控制。
public class JwtTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String token = extractToken(request);
if (StringUtils.isBlank(token)) {
chain.doFilter(request, response);
return;
}
Claims claims = JwtUtils.parseJwtToken(token);
if (claims == null) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
List<String> authorities = (List<String>) claims.get("authorities");
List<SimpleGrantedAuthority> grantedAuthorities = authorities.stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
claims.getSubject(),
null,
grantedAuthorities);
SecurityContextHolder.getContext().setAuthentication(auth);
chain.doFilter(request, response);
}
private String extractToken(HttpServletRequest request) {
String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
if (StringUtils.isBlank(authHeader)) {
return null;
}
return authHeader.replaceFirst("Bearer ", "");
}
}
以上两个示例展示了如何在SpringBoot项目中使用JWT实现用户登录和接口权限控制。
结语
本篇文章介绍了JWT实现SpringBoot权限验证的详细流程,同时配合实例操作帮助理解,希望能够帮助到大家。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解基于JWT的springboot权限验证技术实现 - Python技术站