Почему Spring Security возвращает пустое тело ответа? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть следующая конфигурация 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 () , возвращается нормально.

1 Ответ

0 голосов
/ 03 марта 2020

Так что на самом деле я думаю, что вам нужен метод getWriter, поскольку sendError не используется для успешного результата.

Попробуйте следующее:

response.setStatus(HttpServletResponse.SC_OK); // You can use another constant if u like
response.getWritter().print("Bearer " + token);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...