Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

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 directamente

    todo 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
    titleVer ejemplo...


    Bloque de código
    languagejava
    @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:

...