javaspringboot token
时间: 2024-12-31 17:21:51 浏览: 8
### 如何在 Java Spring Boot 中实现 Token 认证和授权
#### 一、引入必要的依赖
为了支持基于Token的身份验证,在项目中需加入`spring-boot-starter-security`作为安全框架的基础[^2]。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
```
此外,还需集成用于创建和解析JSON Web Tokens (JWTs) 的库,比如JJWT:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<!-- or jjwt-gson if Gson is preferred -->
<scope>runtime</scope>
<version>${jjwt.version}</version>
</dependency>
```
#### 二、配置Spring Security以适应Token认证模式
通过自定义`WebSecurityConfigurerAdapter`类来调整默认的安全设置,允许特定路径无需身份验证即可访问(如登录端点),并对其他请求实施Token校验逻辑。对于已受保护资源的每一次HTTP请求,都应携带有效的Bearer Token以便于服务器端完成鉴权操作[^1]。
#### 三、构建Token处理工具类
此部分涉及到了解如何编码与解码Tokens。可以利用第三方库简化这一过程;例如,使用JJWT提供的API快速生成带有签名的有效载荷以及从传入Headers提取Claims信息等功能[^3]。
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
public class JwtUtil {
private static final String SECRET_KEY = "your_secret_key";
/**
* Generate a JWT based on user ID.
*/
public String generateToken(String userId){
return Jwts.builder()
.setSubject(userId)
.signWith(SignatureAlgorithm.HS512,SECRET_KEY.getBytes())
.compact();
}
/**
* Extract the subject from the given token string.
*/
public Claims extractAllClaims(String token){
try{
return Jwts.parser().setSigningKey(SECRET_KEY.getBytes()).parseClaimsJws(token).getBody();
}catch(Exception e){
throw new RuntimeException("Invalid Token");
}
}
}
```
#### 四、设计Login控制器
当接收到POST /login 请求时,应用程序应当执行用户凭证检查工作——即对比数据库记录中的哈希值同客户端发送过来的数据是否匹配。一旦确认合法,则立即签发新的Access Token供后续交互之用。
```java
@PostMapping("/login")
public ResponseEntity<String> authenticateUser(@RequestBody UserCredentials credentials){
// Perform authentication logic here...
boolean isValid = userService.validateUser(credentials.getUsername(),credentials.getPassword());
if(!isValid){
throw new BadCredentialsException("Invalid username/password supplied");
}
String accessToken = jwtUtil.generateToken(userService.getUserIdByUsername(credentials.getUsername()));
Map<Object,Object> model = Collections.singletonMap("access_token",accessToken);
return new ResponseEntity<>(new ObjectMapper().writeValueAsString(model),HttpStatus.OK);
}
```
阅读全文