SecurityContextHolder.getContext() NULL

Veja se consegue pegar o securityContext direto da sessão, assim:

SecurityContext securityContext = (SecurityContext) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SPRING_SECURITY_CONTEXT");

Cara fiz isso que você me falou:


SecurityContext contextSpring = (SecurityContext) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SPRING_SECURITY_CONTEXT"); 
            System.out.println("contextSpring:   "+contextSpring);

no print deu null também.

Meu método login esta assim agora:


 public String logar() throws ServletException, IOException {
        
   
        try {
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            RequestDispatcher dispatcher = ((HttpServletRequest) context.getRequest()).getRequestDispatcher("/j_spring_security_check");
            dispatcher.forward((HttpServletRequest) context.getRequest(), (HttpServletResponse) context.getResponse());
            FacesContext.getCurrentInstance().responseComplete();
//            SecurityContext contextSpring = SecurityContextHolder.getContext();
            SecurityContext contextSpring = (SecurityContext) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SPRING_SECURITY_CONTEXT"); 
            System.out.println("contextSpring:   "+contextSpring);
            User user = null;
            if (contextSpring instanceof SecurityContext) {
                Authentication authentication = contextSpring.getAuthentication();
                
                System.out.println("AUTHENTICATION:  "+authentication);
                if (authentication instanceof Authentication) {
                    user = (User) authentication.getPrincipal();

                    HttpSession session = (HttpSession) context.getSession(false);
                    session.setAttribute("usuarioLogado", usuarioFacade.consultaUsuario(user.getUsername()));
                    Usuario usu = (Usuario) session.getAttribute("usuarioLogado");
                    usuario = usu;
                    unidade = usuario.getUnidade();;
//    id_cidade = usu.getCidade();
//    id_funcao = usu.getFuncao();
                    verificarSenha(user.getPassword(), usu.getUsername());

                }
            }
        } catch (Exception ex) {
            FacesUtil.exibirMensagemErro(ex.getMessage());
        }



        return null;
    }

V

Não sei se pode ser isso, mais o código do método logar() funciona perfeitamente na outra aplicação que tenho, a diferença é que nessa aplicação estou usando a versão Mobile do primefaces junto com JSF, e não tenho certeza se o spring security funciona na versão mobile do primefaces.

Será que esse problema do SecurityContextHolder.getContext(); de vir nulo pode ser por conta da versão mobile do primefaces?

V

Ao fazer o seguinte comando:

 System.out.println("contextSpring:   "+contextSpring);

ele me mostra isso no console:

INFO: contextSpring: org.springframework.security.core.context.SecurityContextImpl@ffffffff: Null authentication

não sei se isso pode ajudar mais…
Cara já faz um tempo que estou me debatendo nisso.

Remova FORWARD do filter mapping, mantenha somente o REQUEST e ERROR:

<filter-mapping>    
        <filter-name>springSecurityFilterChain</filter-name>    
        <url-pattern>/*</url-pattern>    
        <dispatcher>REQUEST</dispatcher> 
        <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

BOAAAA! passou!!!

Bom agora na hora de pegar o usuario:

user = (User) authentication.getPrincipal();

da esse erro:

INFO: ERRO: java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.security.core.userdetails.User

o contextSpring.getAuthentication(); pegou isso:

INFO: contextSpring: org.springframework.security.core.context.SecurityContextImpl@9056f12c: Authentication: org.springframework.security.authentication.AnonymousAuthenticationToken@9056f12c: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@380f4: RemoteIpAddress: 127.0.0.1; SessionId: 04a784135988b80af89a465ace32; Granted Authorities: ROLE_ANONYMOUS

agora só falta pegar o usuario, você poderia me ajudar a resolver mais esse problema?

O problema Foi resolvido obrigado.

Depurei mais se eu tirar o FORWARD o usuario vem com o problema descrito acima, o usuario vem como: anonymousUser e suas permissões também em como ROLE_anonymous, alguma outra solução?