springboot3+Spring Security+JWT+redis+MySQL实现登陆验证
warning:
这篇文章距离上次修改已过201天,其中的内容可能已经有所变动。
以下是一个简化的代码示例,展示了如何在Spring Boot 3、Spring Security和JWT的帮助下实现登录验证,并将用户信息存储在Redis中,并使用MySQL作为数据库。
// UserController.java
@RestController
@RequestMapping("/api/auth")
public class UserController {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private RedisTemplate<String, User> redisTemplate;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
try {
// 使用Spring Security进行登录验证
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())
);
// 生成JWT token
final User user = (User) authentication.getPrincipal();
String token = jwtTokenUtil.generateToken(user);
// 将用户信息存储到Redis中
redisTemplate.opsForValue().set(user.getUsername(), user, 30, TimeUnit.MINUTES);
// 返回包含JWT token的响应
return ResponseEntity.ok(new JwtResponse(token));
} catch (AuthenticationException e) {
return new ResponseEntity<>(Collections.singletonMap("error", e.getMessage()), HttpStatus.UNAUTHORIZED);
}
}
}
// SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Autowired
private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
@Autowired
private JwtRequestFilter jwtRequestFilter;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/login").permitAll()
.anyRequest().authenticated()
.and()
评论已关闭