springBoot整合jwt详细步骤
时间: 2023-10-07 14:04:23 浏览: 362
springboot结合jwt
5星 · 资源好评率100%
Spring Boot整合JWT的详细步骤如下:
1. 添加依赖
在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
2. 自定义JWT配置类
创建一个JWT配置类,用于配置JWT的一些参数,如密钥、过期时间等。
```java
@Configuration
public class JwtConfig {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
public String getSecret() {
return secret;
}
public Long getExpiration() {
return expiration;
}
}
```
其中,`@Value`注解用于从配置文件中获取参数值。
3. 创建JWT工具类
创建一个JWT工具类,用于生成和解析JWT。
```java
@Component
public class JwtUtils {
@Autowired
private JwtConfig jwtConfig;
// 生成JWT
public String generateToken(User user) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtConfig.getExpiration());
return Jwts.builder()
.setSubject(Long.toString(user.getId()))
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, jwtConfig.getSecret())
.compact();
}
// 解析JWT
public Long getUserIdFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(jwtConfig.getSecret())
.parseClaimsJws(token)
.getBody();
return Long.parseLong(claims.getSubject());
}
// 验证JWT
public boolean validateToken(String token, UserDetails userDetails) {
Long userId = getUserIdFromToken(token);
return userId.equals(userDetails.getId()) && !isTokenExpired(token);
}
// 判断JWT是否过期
public boolean isTokenExpired(String token) {
Date expiryDate = Jwts.parser()
.setSigningKey(jwtConfig.getSecret())
.parseClaimsJws(token)
.getBody()
.getExpiration();
return expiryDate.before(new Date());
}
}
```
其中,`generateToken()`方法用于生成JWT,`getUserIdFromToken()`方法用于从JWT中获取用户ID,`validateToken()`方法用于验证JWT是否有效,`isTokenExpired()`方法用于判断JWT是否过期。
4. 创建登录接口
创建一个登录接口,用于验证用户身份并生成JWT。
```java
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtUtils jwtUtils;
@Autowired
private UserDetailsService userDetailsService;
// 登录接口
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@RequestBody LoginForm loginForm) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(loginForm.getUsername(), loginForm.getPassword())
);
SecurityContextHolder.getContext().setAuthentication(authentication);
UserDetails userDetails = userDetailsService.loadUserByUsername(loginForm.getUsername());
String token = jwtUtils.generateToken((User) userDetails);
return ResponseEntity.ok(new JwtResponse(token));
}
}
```
其中,`authenticateUser()`方法使用`AuthenticationManager`进行用户身份验证,如果验证通过,则生成JWT并返回。
5. 创建受保护的接口
创建一个受保护的接口,只有携带有效JWT的请求才能访问。
```java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
// 获取当前用户信息
@GetMapping("/me")
@PreAuthorize("hasRole('USER')")
public ResponseEntity<?> getCurrentUser() {
User user = userService.getCurrentUser();
return ResponseEntity.ok(user);
}
}
```
其中,`@PreAuthorize("hasRole('USER')")`注解用于指定只有具有`USER`角色的用户才能访问该接口。
6. 配置Spring Security
在Spring Security配置类中,配置JWT的过滤器和认证提供者。
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtUtils jwtUtils;
@Autowired
private UserDetailsService userDetailsService;
// 配置JWT过滤器
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter(jwtUtils, userDetailsService);
}
// 配置认证提供者
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
// 配置密码加密器
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 配置Spring Security
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
```
其中,`jwtAuthenticationFilter()`方法用于创建JWT过滤器,`configure(AuthenticationManagerBuilder auth)`方法用于配置认证提供者,`passwordEncoder()`方法用于配置密码加密器,`configure(HttpSecurity http)`方法用于配置Spring Security,指定哪些接口需要受保护,哪些接口不需要受保护。
至此,Spring Boot整合JWT的详细步骤就完成了。
阅读全文