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
Copy <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
Copy 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"})
Copy 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.
Copy 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.
Copy 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
Copy <?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.
Copy http://localhost:8080/
Postman
Ahora deseamos accesar la lista de paises
Ingresamos en el url
Copy http://localhost:8080/resources/paises
Desde google chrome
Se activa el dialogo solicitando el nombre de usuario y el password, usaremos
Copy 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