Я предвосхищу это, объяснив, что я моделирую многие из моих решений из приложений, созданных генератором JHipster: https://www.jhipster.tech/security/
Вместо возврата AUTHORIZED или UNAUTHORIZED из конечной точки / authenticate я возвращаю JWT. Конечная точка / authenticate срабатывает во время шага входа в систему, и JWT сохраняется. Смотрите следующий пример:
@PostMapping("/authenticate")
@Timed
public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) {
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword());
Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
String jwt = tokenProvider.createToken(authentication, rememberMe);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
}
Затем я могу запустить сохраненный токен через фильтр в любое время, когда конечная точка API используется для определения, все еще ли пользователь AUTHENTICATED или UNAUTHENTICATED:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String jwt = resolveToken(httpServletRequest);
if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
Authentication authentication = this.tokenProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(servletRequest, servletResponse);
}
И для разрешения токена JWT:
private String resolveToken(HttpServletRequest request){
String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
AUTHORIZATION_HEADER - это просто «Авторизация»:
public static final String AUTHORIZATION_HEADER = "Authorization";
Есть некоторые недостающие фрагменты, которые я не включил в этот ответ, которые вы, вероятно, можете вывести, но если вы изо всех сил, я бы посоветовал вам сгенерировать монолитное приложение JHipster и увидеть из первых рук хорошую реализацию JWT, которую вы можете смоделировать. собственная реализация после. Это одна из моих статей о помощи с приложениями Java, Spring, Maven.