Вам нужен фильтр AbstractAuthenticationProcessingFilter для генерации токена JWT в / api / auth / signin и GenericFilterBean для извлечения объекта аутентификации и помещения его в SecurityContextHolder
, есть хороший пример по следующей ссылке:
https://auth0.com/blog/securing-spring-boot-with-jwts/
http.antMatcher("/api**")
.httpBasic().disable()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// We filter the api/login requests
.addFilterBefore(new JWTLoginFilter("/api/auth/signin", authenticationManager()),
UsernamePasswordAuthenticationFilter.class)
// And filter other requests to check the presence of JWT in header
.addFilterBefore(new jwtAuthorizationFilter(),
UsernamePasswordAuthenticationFilter.class);
И я не уверен, возможно ли вернуть сгенерированный токен из successAuthentication () в JWTLoginFilter в теле ответа
образец возвращает токен в заголовке авторизации ответа.но если хочешь вернуть токен в тело.Вы можете использовать следующий код:
static void addAuthentication(HttpServletResponse res, String username) {
String JWT = Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
// res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
JSONObject tokenJson = new JSONObject();
tokenJson.put(SecurityConstants.JWT_TOKEN, JWT);
tokenJson.put(SecurityConstants.USERNAME, username);
try(PrintWriter writer = res.getWriter()) {
writer.print(tokenJson.toJSONString());
writer.flush();
} catch (IOException e) {
LOG.error("error ...");
}
// res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
}