SpringSecurity не позволяет отправить ответ хотя стоит permitAll
SecurityConfig
@EnableWebSecurity
@RequiredArgsConstructor
@EnableMethodSecurity
public class SecurityConfig {
private final UserService userService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
return http.csrf(csrf -> csrf.disable())
.cors(cors -> cors.disable())
.authorizeHttpRequests(auth -> auth.requestMatchers("/secured").authenticated()
.requestMatchers("/admin").hasRole("ADMIN")
.requestMatchers("/info").authenticated()
.requestMatchers("/auth").permitAll()
.anyRequest().permitAll())
.sessionManagement(sessionManager -> sessionManager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.exceptionHandling(exception -> exception.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))).build();
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider(){
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
daoAuthenticationProvider.setUserDetailsService(userService);
return daoAuthenticationProvider;
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception{
return authenticationConfiguration.getAuthenticationManager();
}
}
JwtTokenUtils
@Component
public class JwtTokensUtils {
@Value("${jwt.secret}")
private String secret;
private Duration jwtLifeTime = Duration.ofMinutes(30);
public String generateToken(UserDetails userDetails){
Map<String, List<String>> claims = new HashMap<>();
List<String> rolesList = userDetails.getAuthorities().stream()
.map(GrantedAuthority::getAuthority).collect(Collectors.toList());
claims.put("roles", rolesList);
Date issuedDate = new Date();
Date expiredDate = new Date(issuedDate.getTime() + jwtLifeTime.toMillis());
return Jwts.builder().signWith(SignatureAlgorithm.HS256, secret).claims().add(claims).subject(userDetails.getUsername())
.issuedAt(issuedDate).expiration(expiredDate).and().compact();
}
public String getUsername(String token){
return getAllClaimsFromToken(token).getSubject();
}
public List<String> getRoles(String token){
return getAllClaimsFromToken(token).get("roles", List.class);
}
private Claims getAllClaimsFromToken(String token){
return Jwts.parser().setSigningKey(secret).build().parseClaimsJws(token).getBody();
}
}
AuthController
@RestController
@RequiredArgsConstructor
public class AuthController {
private final UserService userService;
private final JwtTokensUtils jwtTokensUtils;
private AuthenticationManager authenticationManager;
@PostMapping("/auth")
public ResponseEntity<?> createAuthToken(@RequestBody JwtRequest authRequest){
try {
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword()));
} catch (BadCredentialsException e){
return new ResponseEntity<>(new AppError(HttpStatus.UNAUTHORIZED.value(), "Username or password is incorrect"),
HttpStatus.UNAUTHORIZED);
}
System.out.println(authRequest.getUsername());
UserDetails userDetails = userService.loadUserByUsername(authRequest.getUsername());
String token = jwtTokensUtils.generateToken(userDetails);
return ResponseEntity.ok(new JwtResponse(token));
}
}
