在springboot框架下,结合security、jwt写一套登录、认证、鉴权
时间: 2023-12-12 15:03:26 浏览: 26
好的,下面我来介绍一下如何在 Spring Boot 框架下结合 Spring Security 和 JWT 实现登录、认证和鉴权。
1. 添加依赖
首先,我们需要在 pom.xml 文件中添加 Spring Security 和 JWT 的依赖。可以在 Maven 中央仓库中找到相应的依赖。
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
2. 配置 Spring Security
接下来,我们需要配置 Spring Security,使其能够对用户进行认证和鉴权。可以在 Spring Boot 的配置文件(application.yml 或 application.properties)中配置 Spring Security。
```
spring:
security:
user:
name: admin
password: password
```
上面的配置表示创建一个默认的管理员用户,用户名为 admin,密码为 password。
3. 配置 JWT
接下来,我们需要配置 JWT,使其能够生成和验证 token。可以在 Spring Boot 的配置文件中添加以下配置:
```
jwt:
secret: mySecret
expiration: 86400
```
上面的配置表示设置 JWT 的密钥为 mySecret,过期时间为一天(86400 秒)。
4. 编写登录接口
接下来,我们需要编写登录接口,使其能够接收用户的用户名和密码,并返回 JWT token。
```
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenProvider jwtTokenProvider;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
// 认证用户
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
loginRequest.getUsername(),
loginRequest.getPassword()
)
);
// 生成 JWT token
String token = jwtTokenProvider.generateToken(authentication);
// 返回 token
return ResponseEntity.ok(new JwtAuthenticationResponse(token));
}
}
```
上面的代码中,我们使用了 Spring Security 的 AuthenticationManager 对用户进行认证,并使用 JWTTokenProvider 生成 JWT token。
5. 编写鉴权接口
接下来,我们需要编写鉴权接口,使其能够根据 JWT token 鉴权。
```
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/hello")
@PreAuthorize("hasRole('USER')")
public ResponseEntity<?> hello() {
return ResponseEntity.ok("Hello World!");
}
}
```
上面的代码中,我们使用了 Spring Security 的 PreAuthorize 注解,表示只有具有 USER 角色的用户才能访问该接口。
6. 编写 JWTTokenProvider
最后,我们需要编写 JWTTokenProvider,使其能够生成和验证 JWT token。
```
@Component
public class JwtTokenProvider {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private long expiration;
public String generateToken(Authentication authentication) {
User user = (User) authentication.getPrincipal();
Date now = new Date();
Date expiryDate = new Date(now.getTime() + expiration * 1000);
return Jwts.builder()
.setSubject(user.getUsername())
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
return claims.getSubject();
}
}
```
上面的代码中,我们使用了 jjwt 库来生成和验证 JWT token。generateToken() 方法用于生成 token,validateToken() 方法用于验证 token,getUsernameFromToken() 方法用于从 token 中获取用户名。
好了,以上就是在 Spring Boot 框架下结合 Spring Security 和 JWT 实现登录、认证和鉴权的步骤。