Я делаю чистый бэкэнд-проект с 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 );
}
}