Spring Security + JWT 实现基于Token的安全验证
约 445 字
实现基于 Token 的安全验证
一、添加依赖
首先,需要将 Spring Security 和 JWT 相关依赖添加到项目中。可以在 Maven 或 Gradle 中添加以下依赖:
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
Gradle:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'com.auth0:java-jwt:4.4.0'
}
二、配置 Spring Security 在SecurityConfig
类上添加@EnableWebSecurity
注解,以启用 Spring Security:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
}
在configure(HttpSecurity http)
方法中配置 JWT 验证:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.exceptionHandling().authenticationEntryPoint(new JwtAuthenticationEntryPoint())
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/**").hasRole("USER")
.anyRequest().authenticated();
}
这里禁用了 CSRF(跨站请求伪造)保护,并配置了基于 JWT 的身份验证。还定义了/api/auth/**
请求不需要身份验证,而其他所有请求都需要身份验证。只有具有USER
角色的用户才能访问/api/**
请求。
三、创建 JWT 身份验证服务
接下来,需要创建一个 JWT 身份验证服务,该服务将接受用户提供的用户名和密码,并生成 JWT。这个服务可以放在AuthenticationService
类中:
@Service
public class AuthenticationService {
@Autowired
private UserRepository userRepository;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@PostMapping("/api/auth/login")
public ResponseEntity<?> createAuthenticationToken(@RequestParam String username, @RequestParam String password) throws AuthenticationException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found with username: " + username);
} else if (!user.getPassword().equals(password)) {
throw new BadCredentialsException("Invalid password for user: " + username);
} else {
String jwt = jwtTokenUtil.generateToken(user);
return ResponseEntity.ok(new JwtResponse(jwt));
}
}
}
四、创建 JWT Token 服务
接下来,需要创建一个 JWT Token 服务,该服务将用于生成和验证 JWT。这个服务可以放在JwtTokenUtil
类中:
public class JwtTokenUtil {
private Key key;
private long expiresIn;
private long notBefore;
private String algorithm;
private String secret;
//getters and setters here