All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ec.gob.senescyt.sniese.commons.security.shiro.SeguridadRealm Maven / Gradle / Ivy

There is a newer version: 2.0.5
Show newest version
package ec.gob.senescyt.sniese.commons.security.shiro;

import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.UniformInterfaceException;
import ec.gob.senescyt.sniese.commons.clients.ServicioFactory;
import ec.gob.senescyt.sniese.commons.clients.ServicioUsuarioCliente;
import ec.gob.senescyt.sniese.commons.security.Permiso;
import ec.gob.senescyt.sniese.commons.security.PrincipalProviderImpl;
import ec.gob.senescyt.sniese.commons.security.Usuario;
import ec.gob.senescyt.sniese.commons.security.UsuarioAutenticado;
import ec.gob.senescyt.sniese.commons.security.exceptions.LoginIncorrectoException;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

import java.util.HashSet;
import java.util.Optional;

public class SeguridadRealm extends AuthorizingRealm {

    protected static final String NOMBRE_REALM = "SenescytRealm";
    private ServicioUsuarioCliente servicioUsuarioCliente;

    private String tokenAutenticacionServicio;

    @Override
    public String getName() {
        return NOMBRE_REALM;
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof BearerToken;
    }

    @Override
    @SuppressWarnings("PMD.PreserveStackTrace")
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken tokenAutenticacion) throws AuthenticationException {
        String credenciales = String.valueOf(tokenAutenticacion.getCredentials());
        return obtenerInformacionAutenticacionConCredenciales(credenciales);
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        Optional usuarioAutenticadoOpcional = principals.fromRealm(NOMBRE_REALM).stream().findFirst();
        HashSet permisos = new HashSet<>();
        if (usuarioAutenticadoOpcional.isPresent()) {
            usuarioAutenticadoOpcional.get().getPermisos().stream().map(Permiso::getNombrePermiso).forEach(nombrePermiso -> permisos.add(nombrePermiso));
        }
        return new SimpleAuthorizationInfo(permisos);
    }

    public void setServicioUsuarioCliente(String dominioAutenticacion) {
        servicioUsuarioCliente = new ServicioUsuarioCliente(
                new ServicioFactory(dominioAutenticacion, tokenAutenticacionServicio),
                new PrincipalProviderImpl());
    }

    public void setTokenAutenticacionServicio(String tokenAutenticacionServicio) {
        this.tokenAutenticacionServicio = tokenAutenticacionServicio;
    }

    private AuthenticationInfo obtenerInformacionAutenticacionConCredenciales(String credenciales) {
        return credenciales.equals(tokenAutenticacionServicio) ?
                obtenerAutenticacionDeUsuarioSistema(credenciales) :
                obtenerAutenticacionDelTokenUsuario(credenciales);
    }

    private AuthenticationInfo obtenerAutenticacionDelTokenUsuario(String credenciales) {
        try {
            Usuario usuarioAutenticado = servicioUsuarioCliente.obtenerInformacionUsuarioPorToken(credenciales);
            usuarioAutenticado.setCredenciales(credenciales);
            return new SimpleAuthenticationInfo(usuarioAutenticado, credenciales, NOMBRE_REALM);
        } catch (ClientHandlerException | UniformInterfaceException e) {
            throw new LoginIncorrectoException(e.getLocalizedMessage());
        }
    }

    private AuthenticationInfo obtenerAutenticacionDeUsuarioSistema(String credenciales) {
        return new SimpleAuthenticationInfo(UsuarioAutenticado.crearUsuarioSistemaConCredenciales(credenciales), credenciales, NOMBRE_REALM);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy