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
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:
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.
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