Tengo una API REST escrita en Spring con Spring Security y Spring Boot con el paquete Web Started. Algunos de mis métodos inspeccionan un token JWT:
@RequestMapping(value = "/list", method = GET, produces = APPLICATION_JSON_VALUE) public HttpEntity<List<Item>> list(@RequestHeader(name = TOKEN_HEADER) String token) { // validate token // do something } ¿Es posible mover la inspección del token a un método que se invocaría a través de la anotación @PreAuthorize ? Algo como:
@RequestMapping(value = "/list", method = GET, produces = APPLICATION_JSON_VALUE) @PreAuthorize("myMethod(headers)") public HttpEntity<List<Item>> list(@RequestHeader(name = TOKEN_HEADER) String token) { // do something } void myMethod(HttpHeaders headers) { // validate token }El token contiene información sobre los recursos a los que pueden acceder usuarios específicos. Si el token no contiene el recurso que solicita el usuario o los datos en la capa de datos subyacente indican que el usuario no tiene acceso a él, devuelvo HTTP 403.
Está intentando delegar la autenticación y la autorización al controlador, y no es una buena idea.
La forma de manejar los tokens en los encabezados es implementar un filtro que encapsule la autenticación y autorización por token y ponga en sesión al usuario y los roles del usuario registrado.
Luego, la anotación de autorización previa verifica el contexto como desee.
Puede ver https://jwt.io/ para comprender el flujo de tokens.