br.mdarte.exemplo.academico.accessControl.ControleAcessoImpl.java Source code

Java tutorial

Introduction

Here is the source code for br.mdarte.exemplo.academico.accessControl.ControleAcessoImpl.java

Source

// license-header java merge-point
// Generated by: ControleAcessoImpl.vsl in andromda-ejb-cartridge.
//

package br.mdarte.exemplo.academico.accessControl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;

import org.apache.commons.logging.impl.Log4JLogger;

import com.sun.org.omg.SendingContext.CodeBaseHelper;

import br.mdarte.exemplo.academico.util.Constantes;
import accessControl.LoginCallbackHandler;
import accessControl.PrincipalImpl;
import accessControl.exception.ControleAcessoException;
import br.gov.mdarte.controleacesso.cd.Acao;
import br.gov.mdarte.controleacesso.cd.AcaoDAOImpl;
import br.gov.mdarte.controleacesso.cd.Perfil;
import br.gov.mdarte.controleacesso.cd.PerfilDAOImpl;
import br.gov.mdarte.controleacesso.cd.UsuarioDAOImpl;
import br.gov.mdarte.controleacesso.cd.UsuarioImpl;

public class ControleAcessoImpl extends accessControl.ControleAcesso {
    public static final int PROXIMA_TROCA_SENHA_DIAS = 30;

    /**
     * Verifica se o operador necessita trocar senha obrigatoria
     */
    @Override
    public boolean precisaTrocarSenha(accessControl.Operador operador) throws ControleAcessoException {
        return false;
    }

    /**
     * Recupera o operador de acordo com o login
     */
    @Override
    public accessControl.Operador getOperador(String usuario) throws ControleAcessoException {

        UsuarioDAOImpl usuarioDAO = new UsuarioDAOImpl();

        try {
            return (accessControl.Operador) usuarioDAO.recuperarUsuario(usuario);
        } catch (br.gov.mdarte.controleacesso.cd.DAOException exception) {
            throw new ControleAcessoException(exception);
        } catch (Exception exception) {
            throw new ControleAcessoException(exception);
        }
    }

    private HashMap<String, Collection<accessControl.Perfil>> addServices(
            HashMap<String, Collection<accessControl.Perfil>> hmServicos, Acao acao,
            Collection<accessControl.Perfil> perfis) {
        if (hmServicos.get(acao.getCodigo()) != null) {
            hmServicos.get(acao.getCodigo()).addAll(perfis);
        } else {
            hmServicos.put(acao.getCodigo(), perfis);
        }

        for (Acao acaoAgrupada : (Collection<Acao>) acao.getEAgrupadoPor()) {
            hmServicos = addServices(hmServicos, acaoAgrupada, perfis);
        }

        return hmServicos;
    }

    /**
     * lista os servicos em um map onde a chave eh o nome do servico e o valor a colecao de perfis que possui acesso ao servico
     */
    @Override
    public java.util.HashMap<String, java.util.Collection<accessControl.Perfil>> listaServicos()
            throws ControleAcessoException {

        HashMap<String, Collection<accessControl.Perfil>> hmServicos = new HashMap<String, Collection<accessControl.Perfil>>();

        AcaoDAOImpl acaoDAO = new AcaoDAOImpl();
        PerfilDAOImpl perfilDAO = new PerfilDAOImpl();

        ArrayList<Long> superPerfils = new ArrayList<Long>();
        List acaoList = new ArrayList();

        try {
            // recupera os perfils supers do sistema
            superPerfils = (ArrayList<Long>) perfilDAO.recuperarSuperPerfil(Constantes.SISTEMA, null);

            // recupera todos os servios
            acaoList = (List) acaoDAO.recuperarAcoes(null);
        } catch (br.gov.mdarte.controleacesso.cd.DAOException exception) {
            throw new ControleAcessoException(exception);
        }

        for (Acao acao : (Collection<Acao>) acaoList) {
            Collection<Perfil> perfilAcaoList = acao.getPerfils();
            Collection<accessControl.Perfil> perfilList = new HashSet<accessControl.Perfil>();

            // adiciona SU para todos os servicos
            if (superPerfils != null && !superPerfils.isEmpty()) {
                for (Long idPerfil : superPerfils) {
                    perfilList.add(new accessControl.Perfil(idPerfil.toString()));
                }
            }

            for (Perfil perfilCA : perfilAcaoList) {

                // Adiciona no mapa os perfis filhos, se houver. Implementao do agrupamento de perfis.
                Collection<Perfil> perfisDescendentes = recuperarPerfisDescendentes(perfilCA);
                for (Perfil perfilFilhoAtual : perfisDescendentes) {
                    accessControl.Perfil perfilFilho = new accessControl.Perfil(
                            perfilFilhoAtual.getId().toString());
                    perfilList.add(perfilFilho);
                }

                accessControl.Perfil perfil = new accessControl.Perfil(perfilCA.getId().toString());
                perfilList.add(perfil);
            }

            if (!perfilList.isEmpty())
                hmServicos = addServices(hmServicos, acao, perfilList);
        }

        return hmServicos;
    }

    private Collection<Perfil> recuperarPerfisDescendentes(Perfil perfilUsuario) {
        List<Perfil> perfisDescendentes = new ArrayList<Perfil>();

        if (perfilUsuario.getPerfilFilho() != null) {
            Collection<Perfil> perfisFilhos = perfilUsuario.getPerfilFilho();
            for (Perfil perfilAtual : perfisFilhos) {
                perfisDescendentes.addAll(recuperarPerfisDescendentes(perfilAtual));
            }
        }

        perfisDescendentes.add(perfilUsuario);

        return perfisDescendentes;
    }

    /**
     * realiza a troca de senha do operador
     */
    @Override
    public boolean trocaSenha(accessControl.Operador operador, String senhaAtual, String novaSenha)
            throws ControleAcessoException {

        UsuarioDAOImpl usrDAO = new UsuarioDAOImpl();
        UsuarioImpl usrRetrieved;
        UsuarioImpl usr = (UsuarioImpl) operador;
        usrRetrieved = (UsuarioImpl) getOperador(usr.getLogin());

        if (!usrRetrieved.getSenha().equals(senhaAtual))
            return false;

        usrRetrieved.setSenha(novaSenha);
        Calendar calendar = new GregorianCalendar();
        calendar.add(Calendar.DATE, PROXIMA_TROCA_SENHA_DIAS);
        usrRetrieved.setDataValidadeSenha(calendar.getTime());

        try {
            usrDAO.update(usrRetrieved);
        } catch (br.gov.mdarte.controleacesso.cd.DAOException exception) {
            exception.printStackTrace();
            return false;
        }

        return true;
    }

    /**
     * Bloqueia o acesso do usurio
     */
    @Override
    public void bloqueiaUsuario(String usuario) {

    }

    /**
     * Verifica se o acesso do usurio est bloqueado
     */
    @Override
    public boolean usuarioBloqueado(String usuario) {
        return false;
    }

    /**
     * Verifica se a senha  fraca
     */
    @Override
    public boolean senhaFraca(String senha) {

        /* IMPLEMENTACAO SUGERIDA
         *
         * (a senha deve possuir pelo menos 8 caracteres,
         * incluindo numerais, letras maisculas,
         * letras minsculas e smbolos)
         */

        if (senha == null) {
            return true;
        }

        if (senha.length() < 8) {
            return true;
        }

        String numerais = "0123456789";
        String maiusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String minusculas = "abcdefghijklmnopqrstuvwxyz";
        String simbolos = " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";

        boolean achouNumeral = false;
        boolean achouMaiuscula = false;
        boolean achouMinuscula = false;
        boolean achouSimbolo = false;

        for (int i = 0; i < senha.length(); i++) {
            achouNumeral |= numerais.indexOf(senha.charAt(i)) > -1;
            achouMaiuscula |= maiusculas.indexOf(senha.charAt(i)) > -1;
            achouMinuscula |= minusculas.indexOf(senha.charAt(i)) > -1;
            achouSimbolo |= simbolos.indexOf(senha.charAt(i)) > -1;
        }

        return !achouNumeral || !achouMaiuscula || !achouMinuscula || !achouSimbolo;

    }

    /**
     * lista as restricoes em um map onde a chave eh o perfil e o valor a colecao de restricoes do perfil
     */
    @Override
    public java.util.HashMap<String, java.util.Collection<accessControl.Restricao>> getRestricoes(
            accessControl.Operador operador, accessControl.Servico servico) throws ControleAcessoException {
        // TODO Auto-generated method stub
        return null;
    }

    /**
    *   Busca os perfis associados ao servico
    */
    @Override
    public java.util.Collection<accessControl.Perfil> buscaPerfisServico(accessControl.Servico servico)
            throws ControleAcessoException {

        return null;
    }

    public static class RestricaoDinamicaImpl {
    }

    public void agendaTarefas() {

    }

    public Subject login(String login, String senha) {
        LoginContext loginContext = null;
        try {
            CallbackHandler handler = new LoginCallbackHandler(login, senha);
            loginContext = new LoginContext("sistemaacademico", handler);
            loginContext.login();
            Subject subject = loginContext.getSubject();
            accessControl.SecurityHolder.setSubject(subject);
            PrincipalImpl principal = getCallerPrincipal(subject);
            principal.setNomeProjeto("sistemaacademico");

            return subject;

        } catch (LoginException e) {
            System.err.println(e.getMessage());
            return null;
        }
    }

    public void quitLogin() {
        accessControl.SecurityHolder.setSubject(null);
    }

    public boolean isLogged() {
        if (accessControl.SecurityHolder.getSubject() != null) {
            return true;
        }

        return false;
    }
}