...
Para añadir la validación de claim hay que:
- Crear un objeto OAuth2TokenValidator<Jwt> miClaimValidator = new FundeWebJSClaimValidator( MI_CLAIM, MI_CLAIMVALOR_A_VALIDAR );
con el nombre del claim y el valor a validar en el constructor.
...
| Advertencia |
|---|
Solo deben realizarse estos dos paso, el resto de código del método debe permanecer tal cuál está en el ejemplo. |
-- Respuesta de error --
Cuando llegue una petición con un token que no cumpla las restricciones configuradas con los FundeWebJSClaimValidator, la librería spring-security-oauth2-resource-server toma el control y devuelve la respuesta de la siguiente forma:
- Status Code: 401 Authorized
- Body: VACIO
- Cabecera WWW-Authenticate: Bearer error="invalid_token", error_description="An error occurred while attempting to decode the Jwt: The client_id claim is not valid", error_uri="https://tools.ietf.org/html/rfc6750#section-3.1"
(Siguiendo el ejemplo del bloque de código descrito más arriba).
| Advertencia |
|---|
Repetimos: ESTA CONFIGURACIÓN GLOBAL VALIDARÁ LOS CLAIMS CONFIGURADOS EN TODOS LOS ENDPOINTS DEL API. |
2. Configurar endpoints
...
individualmente
Con la configuración del punto 1 se configura TODA la aplicación para permitir tokens que contengan cualquiera de los scopes configurados.
Esto significa que un token obtenido desde micampus por cualquier usuario sería válido para acceder a cualquier endpoint.
Si hemos tenido que configurar varios scopes, lo normal es que está situación sea no deseada (no queremos que cualquier token sirva para acceder a endpoints que requieran un nivel diferente de acceso).
En este paso se explica cómo configurar nuestra aplicación para securizar diferentes endpoints con scopes distintos.
Existen dos alternativas :
- Configurar los mvcMatchers en el SecurityConfig.
- Utilizar la anotación PreAuthorize en cada método Java de nuestro RestController.
Configuración con PreAuthorize
La segunda forma para configurar endpoints y securizarlos por scope es utilizando la anotación de spring-security @PreAuthorize.
con los claims configurados.
Dependiendo de la situación y del diseño de nuestra API, esto puedo ser necesario, pero el caso más habitual será tener diferentes endpoints y querer realizar una validación de claims diferente en cada uno de ellos.
Por ejemplo, en nuestra API que ofrece servicios a miscampus, podremos querer añadir un endpoint que valide tokens del flujo OAUTH CLIENT_CREDENTIALS para el servicio con claim client_id "tramites".
Esta validación específica de un endpoint se realiza de la siguiente manera:
PreAuthorize
Es necesario utilizar la anotación de spring-security @PreAuthorize con la clase propia de FundeWebJS creada para tal efecto FundeWebJsJwtClaimPreAuthorizer (@umuJwtAuth)Para hacerlo hay que:
- Anotar la clase SecurityConfig con @EnableGlobalMethodSecurity( prePostEnabled = true )
Bloque de código @Configuration @EnableGlobalMethodSecurity( prePostEnabled = true ) public class SecurityConfig {....
Anotar el método java que publica nuestro endpoint (o directamente
Anotar el método java que publica nuestro endpoint (o directamentetodo el RestController en caso de hacer una clase específica
para ese scope) con @PreAuthorize( "hasAuthority('SCOPE_miotroscope')" )validar ese claim) con @PreAuthorize @umuJwtAuth.hasClaim
Bloque de código @PreAuthorize("@umuJwtAuth.hasClaim(authentication, 'MI_CLAIM', 'VALOR_A_VALIDAR')")
Por ejemplo, a este endpoint sólo se podrá acceder con tokens CLIENT_CREDENTIALS:Expandir title Ver ejemplo... Bloque de código language java @GetMapping( "/claimsTest" ) @PreAuthorize("@umuJwtAuth.hasClaim(authentication, 'grant_type', 'CLIENT_CREDENTIALS')") public ResponseEntity<String> validateClaimTest( Jwt jwt ) { return ResponseEntity.ok( "Claims validados" ); }
-- Respuesta de error --
Cuando llega una petición a el/los endpoints con la anotación PreAuthroize y un token inválido la respuesta por defecto será del mismo tipo que en el caso anterior:
...