Microservicios con IdentityStore
Creamos un Microservicio donde establecemos seguridad mediante IdentityStore.
Proyecto: microservicesseguro
Cliente: clienteseguro
Crear proyecto PayaraMicro
Desde NetBeans --> New Project

indicar el nombre del proyecto

indicar la versión de PayaraMicro

Trabajaremos en crear una estructura similar a la imagen

Cuando finalizamos nos quedara el servicio Rest de la siguiente manera

Dependencias archivo pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<failOnMissingWebXml>false</failOnMissingWebXml>
<version.javaee>8.0</version.javaee>
<version.concurrencyUtilities>1.0</version.concurrencyUtilities>
<version.jca>1.7</version.jca>
<version.jbatch>1.0.1</version.jbatch>
<version.payara>5.193</version.payara>
<version.microprofile>2.2</version.microprofile>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>${version.javaee}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.enterprise.concurrent</groupId>
<artifactId>javax.enterprise.concurrent-api</artifactId>
<version>${version.concurrencyUtilities}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.resource</groupId>
<artifactId>javax.resource-api</artifactId>
<version>${version.jca}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.batch</groupId>
<artifactId>javax.batch-api</artifactId>
<version>${version.jbatch}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>${version.microprofile}</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
Crear el entity Paises.java
public class Paises {
private String id;
private String pais;
//get/set
}
Crear PaisesResources.java
Que utilizaremos mediante JAX-RS para devolver la lista de paÃses mediante @Path("/paises") identificamos el path.
Observe que el metodo getPaises() restringuimos el acceso solo a administrador mediante @RolesAllowed({"administrador"})
import com.avbravo.microservicesseguro.entity.Paises;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
*
* @author avbravo
*/
@Stateless
@Path("/paises")
public class PaisesResources {
@GET
@Produces(MediaType.APPLICATION_JSON)
@RolesAllowed({"administrador"})
public List<Paises> getPaises() {
List<Paises> paises = new ArrayList<Paises>();
paises.add(new Paises("pa", "Panama"));
paises.add(new Paises("cu", "Cuba"));
paises.add(new Paises("co", "Colombia"));
paises.add(new Paises("es", "España"));
return paises;
}
}
Crear la clase principal JAXRSConfiguration.java
Mediante @DeclareRoles espeficamos los roles permitidos para usar el Microservicio.
@BasicAuthentificationMechanismDefinition definimos el tipo de autentificaciòn.
import java.util.Set;
import javax.annotation.security.DeclareRoles;
import javax.enterprise.context.ApplicationScoped;
import javax.security.enterprise.authentication.mechanism.http.BasicAuthenticationMechanismDefinition;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationScoped
@ApplicationPath("resources")
@DeclareRoles({ "administrador", "testing" })
@BasicAuthenticationMechanismDefinition(realmName = "admin-realm")
public class JAXRSConfiguration extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
resources.add(com.avbravo.microservicesseguro.resources.PaisesResources.class);
return resources;
}
}
Crear la clase TestIdentityStore.java
Que implementara la validación del username, password y devolvera los roles del usuario.
A modo de ejemplo usamos: myusername, mypassword para autentificar al usuario y devolvemos los roles. En un ejemplo real puede ser información proveniente de una base de datos u otro repositorio.
import static java.util.Arrays.asList;
import java.util.HashSet;
import javax.enterprise.context.ApplicationScoped;
import javax.security.enterprise.credential.UsernamePasswordCredential;
import javax.security.enterprise.identitystore.CredentialValidationResult;
import static javax.security.enterprise.identitystore.CredentialValidationResult.INVALID_RESULT;
import javax.security.enterprise.identitystore.IdentityStore;
/**
*
* @author avbravo
*/
@ApplicationScoped
public class TestIdentityStore implements IdentityStore {
public CredentialValidationResult validate(UsernamePasswordCredential usernamePasswordCredential) {
if (usernamePasswordCredential.compareTo("myusername", "mypassword")) {
return new CredentialValidationResult("myusername", new HashSet<>(asList("administrador", "testing")));
}
return INVALID_RESULT;
}
}
Archivo web.xml
Editar el archivo web.xml y agregar los roles permitidos. Que usamos en JAXRSConfiguration.java y en PaisesResources.java
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<!--
JAVA EE 8 API SECURITY
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>Application pages</web-resource-name>
<url-pattern>/faces/pages/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrador</role-name>
<role-name>testing</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>administrador</role-name>
</security-role>
<security-role>
<role-name>testing</role-name>
</security-role>
</web-app>
Podemos ejecutarlo o convertirlo en un UberJar

Para comprobar que esta funcionando podemos utilizar nuestro navegador o Postman. Si es en la maquina local puede usar localhost o el ip.
http://localhost:8080/

Postman

Ahora deseamos accesar la lista de paises
/resources/paises
Ingresamos en el url
http://localhost:8080/resources/paises
Desde google chrome

Se activa el dialogo solicitando el nombre de usuario y el password, usaremos
nombre de usuario: myusername
password: mypassword

Si los datos son correcto accedemos al servicio y obtenemos los resultados

Si usamos Postman

Necesitamos indicar los parámetros, dar clic en el botón Param

En tipo de autentificacion selecionar Basic Auth

ingresar los datos

dar clic en el botón Update Request

y presionar nuevamente el botòn Send

Last updated
Was this helpful?