У меня есть следующая конфигурация Spring Security:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.authorizeRequests().antMatchers("/user/authenticate")
.permitAll().anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
Я сделал фильтр, который расширяет UsernamePasswordAuthenticationFilter
для выполнения моей конечной точки аутентификации. Есть 2 способа обработки ответов этой конечной точки: один, если аутентификация прошла успешно, другой, если аутентификация не удалась:
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain, Authentication authentication) throws IOException {
UserDto user = ((UserDto) authentication.getPrincipal());
//Here is converted the roles/authorities from the user.
List<String> roles = user.getAuthorities().stream().map(GrantedAuthority::getAuthority)
.collect(Collectors.toList());
byte[] signingKey = Constants.JWT_SECRET.getBytes();
//Token builder.
String token = Jwts.builder().signWith(Keys.hmacShaKeyFor(signingKey), SignatureAlgorithm.HS512)
.setHeaderParam("typ", Constants.TOKEN_TYPE)
.setIssuer(Constants.TOKEN_ISSUER)
.setAudience(Constants.TOKEN_AUDIENCE)
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 864000000))
.claim("rol", roles)
.compact();
response.setContentType("application/json");
response.sendError(response.getStatus(), "Bearer " + token);
}
@Override
protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,
AuthenticationException failed) throws IOException, ServletException {
System.out.println("MESSAGE UNAUTHORIZED : " + failed.getMessage());
response.sendError(response.SC_UNAUTHORIZED, failed.getMessage());
}
Я использую метод authenticated () для защиты (фильтрация) маршруты. Но то же самое, только в конечной точке фильтра (/ user / authenticate), возвращает статус и пустое тело ответа. Когда я не использую это, ответ, генерируемый sendError () , возвращается нормально.