[RESOLVIDO] Login Spring Security, Jsf e EJB

4 respostas
E

Ola, Eu tenho um projeto Jsf e EJB e estou incluindo o spring security nele.
O login esta funcionando normal, mas quando informo um usuario ou senha incorreto ele me apresenta o seguinte erro que não consigo resolver:

Advertência: A system exception occurred during an invocation on EJB UsuarioDao, method: public com.entecnologia.entity.Usuario com.entecnologia.dao.UsuarioDao.login(java.lang.String,java.lang.String) Advertência: javax.ejb.EJBException at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:750) at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:700) at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:505) at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) at com.sun.proxy.$Proxy565.login(Unknown Source) at com.entecnologia.dao.__EJB31_Generated__UsuarioDao__Intf____Bean__.login(Unknown Source) at com.entecnologia.securty.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:32) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:167) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:192) at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:93) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) at java.lang.Thread.run(Thread.java:745) Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities. at org.eclipse.persistence.internal.jpa.QueryImpl.throwNoResultException(QueryImpl.java:976) at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:526) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:400) at com.entecnologia.util.Padrao.id(Padrao.java:75) at com.entecnologia.dao.UsuarioDao.login(UsuarioDao.java:70) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786) at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:824) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64) at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) at sun.reflect.GeneratedMethodAccessor157.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:823) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:823) at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758) at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) ... 52 more

codigo:

`
public class CustomAuthenticationProvider implements AuthenticationProvider {

UsuarioDao usuarioDao = lookupUsuarioDaoBean();

private String mensagem;

@Override
public Authentication authenticate(Authentication a) throws AuthenticationException {
    try {
        if (!a.getName().isEmpty() && !a.getCredentials().toString().isEmpty()) {
            Usuario usuario = usuarioDao.login(a.getName(), a.getCredentials().toString());
            
            try{
            System.out.println("usuario: " + usuario);

            if (usuario != null) {
                System.out.println("Passou!");
                mensagem = "Dados Incorretos";
                throw new BadCredentialsException(mensagem);
            } else {
                System.out.println("Erro!");
                return null;
            }
            }catch(EJBException e){
                System.out.println("Erro ejb!");
                return null;
                
            }catch(NoResultException e){
                System.out.println("Erro!");
                return null;
            }
        } else {
            mensagem = "Ops! Faltou informar usuário ou senha!";
            throw new BadCredentialsException(mensagem);
        }
    } catch (Exception e) {
        mensagem = "Ops! Faltou informar usuário ou senha!";
        throw new BadCredentialsException(mensagem);
    }

    /*
    try {
        usuario = usuarioDao.login(a.getName(), a.getCredentials().toString());

        if (usuario != null) {
            System.out.println("Usuario banco: " + usuario.getLogin());
            List<GrantedAuthority> auth = new ArrayList<>();
            auth.add(new SimpleGrantedAuthority("Administrador"));
            return new UsernamePasswordAuthenticationToken(a.getName(), a.getCredentials(), auth);
        } else {
            return null;
        }

    } catch (Exception e) {
        mensagem = "Dados Incorretos";
        throw new BadCredentialsException(mensagem);

    }
     */
}

@Override
public boolean supports(Class<?> type) {
    return type.equals(UsernamePasswordAuthenticationToken.class);
}

private UsuarioDao lookupUsuarioDaoBean() {
    try {
        Context c = new InitialContext();
        return (UsuarioDao) c.lookup("java:comp/env/ejb/UsuarioDao");
    } catch (NamingException ne) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
        throw new RuntimeException(ne);
    }
}

}
`

4 Respostas

P

Ola, repare nesse trecho da exception:

Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
at org.eclipse.persistence.internal.jpa.QueryImpl.throwNoResultException(QueryImpl.java:976)
at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:526)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:400)
at com.entecnologia.util.Padrao.id(Padrao.java:75)

Ele está dizendo que o getSingleResult nao achou nenhum objeto. Isso dentro do metodo id da classe Padrao. Realmente voce nao deve invocar esse método se voce nao tem certeza de que haverá um resultado.

E

Bom dia, Galera esse erro eu consegui resolver utilizando o try/catch. Mas aproveitando o post, estou gerando as mensagens de erro ou notificação da seguinte forma: throw new BadCredentialsException(mensagem);, teria como eu substituir por: FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro", "Mensagem."));

M

Olá @e_novaski.

Não estou conseguindo utilizar o Spring Security na minha aplicação (JSF, JPA, JTA, EJB).

Vi que você obtém o DAO através de JNDI lookup mas não vi como você implementou o UsuarioDao.

Minha pergunta é: a sua classe UsuarioDao é um EJB? Você utiliza a anotação @Stateless e @PersistenceContext para injetar um Entity Manager?

Valeu

E

Olá @marcel2

Eu estou usando sim @Stateless e o @PersistenceContext conforme abaixo:

@Stateless
public class UsuarioDao extends PadraoDao {

public UsuarioDao() {
    super(Usuario.class);
} 

public Usuario buscaPorEmail(String email) {
    String sql = "SELECT tbl FROM Usuario tbl"
            + " WHERE tbl.email = :email";

    Map<String, Object> parametros = new HashMap<>();
    parametros.put("email", email);

    return super.buscaSQL(sql, parametros);
}
Criado 5 de janeiro de 2016
Ultima resposta 20 de abr. de 2017
Respostas 4
Participantes 3