Seguridad integrada en aplicaciones Web Spring Boot
ES | EN
Para facilitar la integración de las aplicaciones Spring Boot web desarrolladas sobre la OpenPlatform, con la autenticación y los Realms de plataforma se proporciona la librería onesaitplatform-web-security-client cuya dependencia es:
<dependency> <groupId>com.minsait.onesait.platform</groupId> <artifactId>onesaitplatform-web-security-client</artifactId> <version>1.3.0-RELEASE</version> </dependency>
Y está disponible para descargar desde el nexus de plataforma: http://nexus.onesaitplatform.com/nexus/content/repositories/releases/
Esta librería permite autenticar a las aplicaciones con el Realm que tengan definido en Plataforma y securizar los servicios REST utilizando authorities y roles definidos en el REALM.
Lo ilustraremos con un ejemplo:
Creamos el Realm TEST_SSO con los authorities auth1, auth2, auth3 y los Roles ROLE_USER, ROLE_ADMINISTRATOR. Recordar que authorities y roles son conceptos muy parecidos, pero los authorities proporcionan un grano más fino en la gestión de permisos, mientras que los Roles agrupan distintos permisos. Es tarea de la aplicación diferenciar entre ellos y gestionarlos. A nivel de servidor OAUTH se diferencian por el prefijo ROLE_ que tienen los Roles:
Una vez definidos los authorities y Roles, los asignamos a los usuarios. En este caso asignamos al usuario jfgpimpollo el ROL_USER y el authority auth1:
Con esto ya tenemos en el servidor OAUTH2 de plataforma la gestión de roles y su asignación a usuarios mediante el REALM de la aplicación. A continuación lo usamos desde nuestra aplicación:
Para ello, en el pom.xml de nuestra aplicación Spring boot añadimos la dependencia de la librería de seguridad web de plataforma:
<dependency> <groupId>com.minsait.onesait.platform</groupId> <artifactId>onesaitplatform-web-security-client</artifactId> <version>1.3.0-RELEASE</version> </dependency>
Y añadimos el repositorio nexus desde el que descargarla:
<repositories> <repository> <id>onesait</id> <url>https://nexus.onesaitplatform.com/nexus/content/repositories/releases/</url> </repository> </repositories>
A continuación, si todavía no hemos habilitado Spring security en el pom.xml de nuestra aplicación, añadimos la dependencia:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
Lo siguiente es añadir al application.properties o application.yml las propiedades que necesita la librería de seguridad, que básicamente son los parámetros de configuración para conectarse al servidor OAUTH2 que gestiona el Realm de la aplicación. En concreto se trata de las siguientes propiedades (en formato .yml):
openplatform.api: baseurl: https://development.onesaitplatform.com auth: login.path: /oauth-server/oauth/token token: verify.path: /oauth-server/openplatform-oauth/check_token grant_type: password scope: openid clientId: TEST_SSO password: onesaitplatform
donde tendremos que ajustar las propiedades:
- baseurl: Es la url de la instancia de OpenPlatform utilizada por la aplicación.
- clientId: Identificador del Realm de la aplicación.
Hay que tener en cuenta que una vez habilitado Spring Security en nuestra aplicación Spring Boot, ésta ha sido securizada por la autoconfiguración que hace Spring Boot, por lo que tendremos que decidir que urls escapamos (al menos la de login), además indicando que estamos securizando recursos mediante OAUTH2 (Extendemos de ResourceServerConfigurerAdapter en vez de WebSecurityConfigurerAdapter). Añadiremos algo de este estilo a nuestra aplicación:
ATENCIÓN: en versiones recientes, debes eliminar .anyRequest().authenticated() para realizar la prueba.
A continuación hay que programar la autenticación contra plataforma con el usuario/password de los usuarios añadidos al REALM de la aplicación. Para esto, la librería onesaitplatform-web-security-client proporciona un Bean de Spring que permite hacer login contra el servidor OAUTH2. Este Bean se puede inyectar añadiendo nuestro componente:
@Autowired private LoginService loginService;
y se utiliza del siguiente modo para recuperar el Token OAUTH2 devuelto por plataforma:
String token=loginService.login(user, password).getToken();
Por ejemplo, para ilustrarlo crearemos un servicio REST para autenticar y recuperar el token:
Lo podemos invocar de forma sencilla desde el navegador recuperando de este modo el Token:
A continuación podemos utilizar ese token enviándolo como cabecera Authorization a todas las peticiones REST y podemos securizar los métodos con anotaciones Spring:
Por ejemplo veremos unos cuantos métodos securizados:
Con respuesta:
Con respuesta
Con respuesta:
Con respuesta: