SpringSecurity: как продолжить пересылку запроса в RestController после успешной аутентификации? - PullRequest
0 голосов
/ 20 марта 2020

Я делаю чистый бэкэнд-проект с REST API (не MVC) и хотел бы использовать SpringSecurity с токеном JWT для проецирования этих API. Реализация хороша, и все API успешно защищены токеном, и я могу опубликовать строку JSON с именем пользователя и паролем в пути "/login", чтобы получить токен

Моя проблема:

  • SpringSecurity будет возвращать ответ с токеном непосредственно в successfulAuthentication(), а не продолжать пересылку в RestController (путь "/login" RestController не получает данных)

И мой вопрос :

  • Что я должен сделать после успешной аутентификации, чтобы SpringSecurity мог продолжать пересылать запрос по пути "/login" RestController, чтобы я мог сделать что-то еще по запросу и недавно построенному маркер рядом с безопасностью в пути?

Благодарю за помощь, спасибо!

Мой код:

@Component
public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {
    // ...

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // ...
        http.authorizeRequests()
                .antMatchers("/registry").permitAll()         // allow path /registry
                .antMatchers("/login").permitAll()            // allow path /login
                .antMatchers("/verify").permitAll()           // allow path /verify
                .anyRequest().authenticated();
        // ...
    }
}


@RestController
public class EntranceEndpoint {

    @RequestMapping(path = "/login", method = RequestMethod.POST)
    public RestResponse<String> login(LoginMetaInfo login) {
        System.out.println(login);  // no output here when login

        // some further operations for a successful login, and return a REST response
    }
}

И это то, что делает SpringSecurity на успешный вход в систему

public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter {
    // ...
    /**
     * on login success
     */
    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) throws IOException {

        // here build the token and insert into response for commitment
        // - the SpringSecurity soon returns the response directly, rather then keep forwarding to RestController
        String token = xxxx;
        response.setStatus(StatusCode.SUCCESS().getCode());
        RestResponse<String> body = RestResponse.succeeded(StatusCode.SUCCESS().withMsg(LoginResponseCode.LOGIN), token);
        response.setContentType(MediaType.APPLICATION_JSON);
        response.setCharacterEncoding(MediaType.CHARSET);
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(response.getWriter(), body );
    }
}

1 Ответ

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

Как насчет простого использования sendRedirect HttpServletResponse вместо записи в ответ?

   @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) throws IOException {

      // do what you want here

        response.sendRedirect("/login");
         // response.sendRedirect("https://yoururl");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...