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