[RESOLVIDO] Login Spring Security, Jsf e EJB

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);
    }
}

}
`

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.

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."));

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

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);
}