Я пытался выполнить аутентификацию и авторизацию на основе токена (JWT) для моего приложения Spring. Конечно через Spring Security. Я был в состоянии сделать часть аутентификации через фильтры. Однако я не могу авторизовать запрос на основе токена JWT, отправленного по HTTP-запросу. Ниже приведен пример кода.
TestRest.java (RestController)
@RestController
public class TestRest {
@GetMapping(value="/protected")
@Secured("ROLE_USER")
public @ResponseBody String protectedMethod () {
logger.info("Entering Proceted Method! is {}" , SecurityContextHolder.getContext().getAuthentication().getAuthorities());
return "I am Protected!";
}
}
JwtAuthTokenFilter.java (фильтр токенов)
@Component
public class JwtAuthTokenFilter extends OncePerRequestFilter{
... some code ...
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
logger.info("Firing JWT Token Filter.");
String authHeader = request.getHeader(this.prop.getHeader());
String authToken = null;
String username = null;
Date expiry = null;
Collection<? extends GrantedAuthority> authorities = null;;
//if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
if (authHeader != null && authHeader.startsWith(bearer)) {
authToken = authHeader.substring(bearer.length());
try {
logger.info("Token: {}",authToken);
username = jwtUtil.getUsernameFromToken(authToken);
authorities = AuthorityUtils.createAuthorityList(jwtUtil.getAudienceFromToken(authToken));
logger.info("Username: {}", username);
logger.info("Roles: {}", authorities);
logger.info("Issue At: {}", jwtUtil.getIssuedAtDateFromToken(authToken));
logger.info("Expiration: {}", jwtUtil.getExpirationDateFromToken(authToken));
} catch (IllegalArgumentException e) {
logger.error("Error Occurred {}", e);
} catch (ExpiredJwtException e) {
logger.warn("Token Expired! {}", e);
}
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
logger.info("authorizingi user!!!");
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(username, null, authorities);
auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
logger.info("{} is authorized", username);
SecurityContextHolder.getContext().setAuthentication(auth);
}
}else {
logger.info("No header, ignoring");
}
filterChain.doFilter(request, response);
logger.info("Closing JWT TOken Filter.");
}
... some code ...
}
Приведенный выше фильтр основан на руководстве, которое я прочитал относительно аутентификации токенов JWT. Кредиты парню. В настоящее время я делаю java-конфигурацию @Secured
для защиты всех моих конечных точек REST-API. Я не буду выполнять настройку пользовательских ролей в веб-конфигурации из-за части обслуживания, которую вы должны определить в antMatchers
. Поэтому я буду реализовывать @Secured
на всех конечных точках REST-API. Однако я не могу сделать пользователя (в токене JWT) авторизованным во всех моих конечных точках REST-API.
Как установить авторизацию, чтобы @Secured
мог ее распознать?