springboot token鉴权
时间: 2025-01-14 18:52:46 浏览: 74
### Spring Boot 中实现 Token 鉴权的最佳实践
#### 1. 添加依赖项
为了在 Spring Boot 应用程序中使用 JWT 进行身份验证,需引入必要的库。通常情况下会添加 `spring-boot-starter-security` 和用于创建和解析 JWT 的库。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Java Web Token (JWT) -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<!-- or jjwt-gson if Gson is preferred -->
<scope>runtime</scope>
<version>0.11.2</version>
</dependency>
```
这些 Maven 依赖项提供了安全性和 JWT 处理功能[^1]。
#### 2. 创建 Token 工具类
定义一个工具类来负责生成和解码 JSON Web Tokens(JWT)。此类应包含方法以设置过期时间、签名算法以及从令牌中提取声明的能力。
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JwtUtil {
private String secret = "yourSecretKey"; // 密钥
public String generateToken(String username){
return Jwts.builder()
.setSubject(username)
.signWith(SignatureAlgorithm.HS256, secret.getBytes())
.compact();
}
public Claims extractAllClaims(String token){
return Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody();
}
}
```
此代码片段展示了如何构建简单的 JWT 实用程序类[^2]。
#### 3. 设置过滤器或拦截器
通过自定义 Filter 或 Interceptor 来保护 API 路径并强制执行基于角色的安全策略。当接收到带有 Bearer Token 的 HTTP 请求时,该组件将尝试对其进行验证,并根据其有效性决定是否允许访问受保护资源。
```java
@Component
public class JwtRequestFilter extends OncePerRequestFilter {
@Autowired
private JwtUtil jwtUtil;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain)throws ServletException, IOException{
final String authorizationHeader = request.getHeader("Authorization");
String username = null;
String jwt = null;
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
jwt = authorizationHeader.substring(7);
try {
username = jwtUtil.extractAllClaims(jwt).getSubject();
} catch (Exception e) { /* Handle exceptions */ }
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
if (jwtUtil.validateToken(jwt, userDetails)) {
UsernamePasswordAuthenticationToken authToken =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authToken);
}
}
}
chain.doFilter(request,response);
}
}
```
这段逻辑实现了对传入请求的身份验证过程[^4]。
#### 4. 登录接口
提供 RESTful 接口供客户端应用程序调用来交换用户名密码组合换取有效的 JWT 。成功认证后返回新生成的令牌给前端应用保存以便后续请求携带。
```java
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@PostMapping("/login")
public ResponseEntity<?> createAuthToken(@RequestBody LoginRequest loginRequest) throws Exception {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = jwtUtils.generateJwtToken((UserDetailsImpl)authentication.getPrincipal());
return ResponseEntity.ok(new JwtResponse(jwt));
}
}
```
上述示例说明了如何编写控制器处理登录操作并响应包含 JWT 的结果对象[^3]。
阅读全文
相关推荐


















