1 de jun de 2012

Realizando Autenticação e Controle de Sessão Manualmente no EJB

Um dos problemas quando se utiliza um sistema standalone acessando sessionBeans é realizar um controle de autenticação e de sessão destes acessos. Nem sempre podemos deixar o sessionBean realizar o seu papel ideal que é apenas a execução de um serviço, desacoplando totalmente do sistema. 
Outro fator é que nem sempre podemos parar apenas na autenticação do contexto para a chamada de um EJB, pois vários sistemas possuem integração com oturos sistemas que necessitam de autenticação. 
Desta forma neste artigo será mostrado formas de autenticação do contexto e como realizar um controle de sessão de forma simples, porém eficiente.


Autenticação pelo contexto

A forma mais comum de autenticação de uma chamada EJB é através do contexto utilizado para realizar o lookup, desta forma vamos utiliza-la como exemplo. Para realizar uma autenticação via contexto basta setar um usuário e senha válida ao iniciar o contexto, como no exemplo: 


try {

            InitialContext context;
            Hashtable<String, String> contexto = new Hashtable<String, String>();
            contexto.put(InitialContext.SECURITY_CREDENTIALS, "senha");
            contexto.put(InitialContext.SECURITY_PRINCIPAL,"usuario"));
            context = new InitialContext(contexto);
            SesionBean s = context.loookup("endereco");
        } catch (NamingException e) {
            e.printStackTrace();
        }


Desta o container EJB fica responsável por cuidar de toda a autenticação, que pode ser configurada através de roles, no descritor da aplicação.
Este é o mundo perfeito onde os session beans são totalmente desacoplados e apenas realizam serviços e retornam resposta. Mas quando desejamos realizar um controle de sessão manual destas chamadas o meio mais eficiente de se fazer é utilizando um recurso nativo do container EJB chamado SessionContext, este recurso guarda todas as informações relevantes do contexto. Para acessá-lo é simples, basta utilizar a anotação @Resource:

Controle de Sessão


@Resource

private SessionContext sessionContext;

A partir disto podemos recuperar o usuário que esta fazendo a chamada ao sessionBean e realizar um controle de sessão e authenticação. A forma mais eficiente e "limpa" de realizar este controle é através de um interceptor, pois com o uso de um interceptor que realiza este controle para as classes desejadas é possível alterar todo o sistema de autenticação alterando apenas uma classe, reduzindo o acoplamento. Para criar um interceptor basta criar uma classe comum que possua um método anotado com @AroundInvoke, com a mesma assinatura mostrada abaixo:


class Interceptor {

@Resource
    private SessionContext ctx;
   
   @AroundInvoke
   public Object checkAuthenticate(InvocationContext invocationContext) throws Exception {

       //neste ponto é possível realizar todo o controle de sessão

      String username = ctx.getCallerPrincipal().getName();

      return invocationContext.proceed();

}

}


@Interceptors(value = Interceptor.class)

class Interceptada {

 public void medotoInterceptado(){}

}


Como é mostado no exemplo é possível recuperar o nome do usuário do contexto que esta acessando o recurso, e este nome é propagado para todas as chamadas de todos os sessionBeans que são chamados de forma secundária na mesma requisição. Ou seja se um método da classe interceptada utilizar outro sessionBean durante a execução ele será invocado no mesmo contexto.
Para criar um controle de sessão é necessário que se tenha uma sessão, para isto pode-se utilizar uma classe singleton com um map Synchronized para realizar este controle, de acordo com a necessidade do domínio.

Nenhum comentário:

Postar um comentário