Lab004 - Control de acceso basado en roles.

En este laboratorio, realizaremos la creación de roles para controlar y restringir este consumo, a clientes específicos.

1. Creación de roles en Keycloak.

1.1. Activar el Keycloak que instalamos en el laboratorio 001.

1.2. Acceder usando las siguientes credenciales; y seleccionar el realm de labs:

  • user: admin
  • password: admin

access to keycloak

select realm labs

1.3. En la barra de navegación, seleccionar la opción Realm Roles y presionar el botón de create role button

nav bar realm roles

1.4. En la pantalla de Create role, introducir el siguiente valor en el formulario:

  • Role name*: lab-admin-role
  • Description: Rol de pruebas para la nivel administrador.

1.5. Presionar el botón save role button

1.6. Repetir el procedimiento para crear otro rol con la siguiente información:

  • Role name*: lab-read-role
  • Description: Rol de pruebas para la nivel usuario.

2. Creación de un usuario en Keycloak.

2.1. Seguir el procedimiento de la laboratorio 001 Paso 4, crear el siguiente usuario:

  • Email verified: true
  • Username: useradmin
  • Email: useradmin@g6flow.com
  • First name: Admin
  • Last name: Demostración

create usueradmin keycloak

2.2. Crear la contraseña del usuario desde la pestaña de Credential, y presionando el botón de set password button, justo como se realizo en el laboratorio 001, colocando la contraseña Pass1234 y desactivando la opción de Temporary.

set password dialiog

confirm save password dialog

2.3. En la pestaña de Role mapping, asignar el role de lab-admin-role al usuario useradmin, presionando el botón assign role button

2.4. En la ventana de selección de roles, presionar el selector del control combinado de Filter by clients, y seleccionar la opción Filter by realm roles.

filter by realm roles

2.5. Seleccionar el role de lab-admin-role y presionar el botón assign role button

check role lab-admin-role

2.6. Como podemos observar en la imagen, se asigno el role seleccionado, con lo que concluimos este paso.

view assigned role

3. Asignar role de lectura a userdemo en keycloak.

Seleccionar al opción de Users desde la barra de navegación del Keycloak y buscar el usuario userdemo y presionar en la columna de Username sobre el:

select userdemo user

Dar clic en la pestaña de Role mapping y repetir los pasos de asignación de role de procedimiento anterior, pero esta vez, seleccionado el role de lab-read-role

select lab-read-role for userdemo

4. Mapeo de roles para el token de keycloak.

Para poder tener acceso a la información de roles del token, es necesario habilitar desde los ámbitos de cliente (Client scopes) mediante un mapper que permita dicha visibilidad. A continuación realizaremos el siguiente procedimiento para si activación.

4.1. Acceder a la opción desde la barra de navegación de Keycloak; de Client scopes, y seleccionar el que dice profile

nav bar client scopes

profile client scope

4.2. En la pestaña de Mappers, presionar el botón de add mapper button y seleccionar la opción de from predefined mappers.

En el cuadro de dialogo de Add predefined mappers, introducir en la barra de búsqueda "roles", seleccionar realm roles y presionar el botón de add mapper button

add mapper realm roles selected dialog

Una vez asignado el mapper, se debe cambiar el Token Claim Name a realm_roles y se debe seleccionar para activar la opción de Add to userinfo y que aparezca al momento de solicitar la información del usuario mediante ese endpoint. Al activar la opción, presionar el botón de save button user realm role

token claim and add to userinfo option

5. Verificación de visibilidad de realm roles en el token.

5.1 Desde el swagger ui del xposer, buscar la sección de OpenID Connect que configuramos en el lab002 y repetir los pasos para solicitar el token y copiarlo para realizar la consulta de los datos en userinfo en el body del response.

/labs/oauth/v2/{*}

post getting token

copy access_token

5.2. En el método GET, llenar las opciones como sigue y presionar el botón de execute button:

  • authorization: bearer [[pegar el token seleccionado en el paso previo]]
  • *: userinfo

get userinfo with roles

Y como podemos apreciar, ya aparece el listado de roles en nuestra información de usuario.

response userinfo with realm roles

5.3. Repetir los pasos, calculando el token con las credenciales del usuario useradmin que fabricamos en pasos previos de este laboratorio.

useradmin userinfo with realm roles

6. Actualización de regla con roles.

A continuación, generaremos una ruta que impida el consumo, a menos que se tenga asignado el rol de lab-admin-role fabricado en el punto 3 de este laboratorio.

6.1. Desde la sección de Xposer Admin RULE del swagger ui del Xposer, utilizaremos el endpoint de PUT /xposer-admin/v1/rules para editar la regla rule::mockwsecuritytoken::001 que creamos en el laboratorio 003, y utilizaremos el siguiente payload para realizar la petición de actualización:

put rules methods option

{
  "name": "rule security  token w/roles",
  "description": "Regla de Servidor de consumo de OAuth2 API aplicando roles.",
  "endpointType": "mockup",
  "mockup": "mockup::testingaccount::001",
  "groups": [],
  "consumers": [],
  "authorizationType": "token",
  "roles": ["lab-admin-role"],
  "route": "route::mockuptest::001",
  "id": "rule::mockwsecuritytoken::001"
}

6.2. Colocar el identificador de la regla en el campo de id y presionar el botón de execute button

req put rule for roles

6.3. Debemos obtener una respuesta como la que se muestra en la imagen, con lo que tendremos la certeza de que se han aplicado los cambios.

resp put rule for roles

Nota: Recuerda introducir el APIKEY en el botón de authorize button, de lo contrario recibirás errores de acceso no autorizado al intentar consumir los servicios.

7. Pruebas de acceso y consumo.

En esta sección, realizaremos las pruebas necesarias para validar que se estén aplicando correctamente los controles de acceso al servicio que protegimos mediante la regla de acceso basada en roles.

Calcularemos un token para el usuario useradmin utilizando la siguiente información

  • client_id: consumidor_autorizado_oauth
  • client_secret: [[EL-SECRET-QUE-GENERARON]]
  • grant_type: password
  • scope: openid email
  • username: useradmin
  • password: Pass1234

Copiamos el token y procedemos a ejecutar el servicio de la sección Lab003 y probamos el servicio de GET /labs/core/accounts y observamos que nos permite ejecutarlo correctamente.

get with valid token

Ahora ejecutaremos con el usuario userdemo, al que le asignamos el role de lab-read-role y que no cuenta con permiso especifico para poder consumir los servicios relacionados con la regla que configuramos anteriormente.

  • client_id: consumidor_autorizado_oauth
  • client_secret: [[EL-SECRET-QUE-GENERARON]]
  • grant_type: password
  • scope: openid email
  • username: userdemo
  • password: Pass1234

get userdemo token with roles

Copiamos el token y en el servicio de GET /labs/core/accounts pegamos el token en la opción de authorization

copy token from invalid user

paste token from invalid user

Y como podemos observar en la imagen a continuación, se rechazo el role, debido a que no cuenta con el role necesario para utilizar el servicio.

user unauthorized