Autenticar usuarario em uma aplicação ejb

1 resposta
V

Olá,

estou desenvolvendo um sistema com EJB…

a parte de segurança eu qro deixar personalizada e usar um interceptor para verificar se o usuario estah logado…
acredito que seja possivel…

Seria basicamente assim:

@Stateful
@Remote(GerenciadorUsuario.class)
@RemoteBinding(jndiBinding = "academico/security/gerenciadorUsuario")
public class GerenciadorUsuarioBean implements GerenciadorUsuario {

	@PersistenceContext
	private EntityManager manager;

	private Usuario usuarioLogado;

        //Verifica se o usuário existe  e seta o atributo usuarioLogado com o usuario retornado do Banco
	@Override
	public Usuario logar(Usuario usuario) throws UsuarioInvalidoException {
		String sql = "select u from Usuario u where u.nomeUsuario = :nome and u.senha = :senha";
		Query query = manager.createQuery(sql);
		try {
			usuarioLogado = (Usuario) query.setParameter("nome",
					usuario.getNomeUsuario()).setParameter("senha",
					usuario.getSenha()).getSingleResult();
		} catch (Exception e) {
			throw new UsuarioInvalidoException("Usuário inválido.", e);
		}
		usuarioLogado.getGrupo().getPermissoes();
		usuarioLogado.getRestricoes();
		usuarioLogado.getExcecoes();
		return user;
	}

        //Retorna usuario logado
	@Override
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}

Os demais EJBs vão ter q verificar se o usuario jah estah logado através de um Interceptor

public class AutenticaInterceptor {

	@AroundInvoke
	public Object autentica(InvocationContext icontext) throws Exception {
//verifica se usuario estah logado... se não estiver lança exceção
		return icontext.proceed();
	}

}

Minha duvida eh a seguinte:

como faço pra obter a referencia do EJB GerenciadorUsuarioBean que estah na sessão através do Interceptor AutenticaInterceptor e verificar se o atributo usuarioLogado é nulo?

Tentei injetar com o @EJB mas não deu certo… ele injeta uma nova instância do EJB GerenciadorUsuarioBean e o usuarioLogado é null

Bom… essa é a primeira ideia que tive… acredito que tenha melhores… se acharem ruim essa implementação agradeço se puderem me sugerir uma outra

desde jah obrigado

1 Resposta

V

bom…

pra quem estiver com a mesma duvida

não consegui fazer da maneira que estava querendo…

resolvi assim:

criei uma autenticação pela aplicação cliente normal

um exemplo no web.xml

<security-constraint>
		<web-resource-collection>
			<web-resource-name>All resources</web-resource-name>
			<description>Protects all resources</description>
			<url-pattern>/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>*</role-name>
		</auth-constraint>
	</security-constraint>
	<security-role>
		<role-name>*</role-name>
	</security-role>
	<login-config>
		<auth-method>BASIC</auth-method>
		<realm-name>Test Realm</realm-name>
	</login-config>

WEB-INF\jboss-web.xml

<?xml version="1.0"?> java:/jaas/academicoJAAS

no login-config.xml

<application-policy name="academicoJAAS">
		<authentication>
			<login-module code="org.jboss.security.ClientLoginModule"
				flag="required">
			</login-module>
			<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
				flag="required">
				<module-option name="dsJndiName">java:/ACADEMICODS</module-option>
				<module-option name="principalsQuery">select Senha from Usuario
					where Login = ?</module-option>
				<module-option name="rolesQuery">select Grupo, 'Roles' FROM
					Usuario where Login = ?</module-option>
				<module-option name="unauthenticatedIdentity">nobody</module-option>
			</login-module>
		</authentication>
	</application-policy>

como disse anteriormente, cada usuário tinha características importantes e por isso tinha que ser uma autenticação personalizada…
essas características ficaram na sessão na aplicação cliente

espero que isso ajude alguém que ficar perdido como eu fiquei

Criado 27 de julho de 2009
Ultima resposta 29 de jul. de 2009
Respostas 1
Participantes 1