Onclick do CommandButton do Primefaces não funciona

Pessoal,

Estou com uma dúvida boba, acho que é fácil de resolver, mas não sei onde estou errando.
Estou começando agora a usar primefaces, jsf, etc.
Criei um arquivo menu.xhtml, com alguns commandButton, um desses botoes é o logoff do sistema (que estou usando o Spring Security), fiz assim:

<p:commandButton styleClass="botao_menu" value="Sair" image="ui-icon-power" onClick="#{facesContext.externalContext.requestContextPath}/j_spring_security_logout"/>                          

O problema é que não funciona, nem se eu colocar esse link no action do botão. Já testei colocando em um commandLink e funciona:

<h:outputLink value="#{facesContext.externalContext.requestContextPath}/j_spring_security_logout"> <h:outputText value="Sair"/> </h:outputLink>

O problema é que não quero que seja um link, quero que seja um botão para ficar no padrão do restante do menu. Como posso resolver isso?

Tenta colocar ajax=“false”.
Muita gente tem este problema.

Mesma coisa:

<p:commandButton styleClass="botao_menu" value="Sair" image="ui-icon-power"
                         onClick="#{facesContext.externalContext.requestContextPath}/j_spring_security_logout"
                         ajax="false"/> 

Só recarrega a página, não efetua o logoff

[quote=JeffersonJCosta]Mesma coisa:

<p:commandButton styleClass="botao_menu" value="Sair" image="ui-icon-power"
                         onClick="#{facesContext.externalContext.requestContextPath}/j_spring_security_logout"
                         ajax="false"/> 

Só recarrega a página, não efetua o logoff[/quote]

Jefferson,
Já tentou utilizando uma action?

Em um projeto com JSF 2, SpringSecurity e PrimeFaces eu utilizo dessa forma.

	<p:commandButton styleClass="botao_menu" value="Sair" image="ui-icon-power"  
                         action="#{loginMBean.logout}"
                         ajax="false"/>   

public String logout() {
		
		String navegacao = "";
		
		try {
			authHelper.deslogar();
			navegacao = "logout";
		} catch(Exception e) {
			
		}
		
		return navegacao;
	}

public void deslogar() {
				
		SecurityContext sc = SecurityContextHolder.getContext();
		Authentication authentication = sc.getAuthentication();
												
		if (authentication.getPrincipal() instanceof ClienteVO) {
						
			final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
			
			SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();	
			logoutHandler.setInvalidateHttpSession(true);
			logoutHandler.logout(request, null, authentication);				
						
		}
	}
	
	
	

Muito obrigado, Daniel. Funcionou, mas acho que ainda tem alguma coisa errada. Se eu estiver rodando o sistema e clicar em sair, ele saí e me redireciona para a página de login, porém meus dados ainda continua no cache/sessão, pois se eu executo o projeto de novo, mesmo depois de ter clicado em sair, ele já vai direto para a página inicial do sistema, sem me pedir para fazer login novamente. Ou está ficando alguma coisa no cache/sessão, ou é alguma coisa com o netbeans

JeffersonJCosta,

Dê uma olhada na sua implementação do Spring Security, regras de acesso, os metodos de login e logout.
Qualquer coisa posta aí os arquivos.

Então, Daniel, já testei várias vezes aqui e revi meu código e não vi nada de errado.
Estou fazendo assim:

UsuarioController:

public UsuarioController() {
        this.validarLogin();
    }

public void validarLogin() {          
        try {
            loginUtil.logar();            
        } 
        catch (Exception e) {
        }
    }
       
    public String logout() {
        String navegacao = "";

        try {
            loginUtil.deslogar();
            navegacao = "login";
        } 
        catch (Exception e) {
        }

        return navegacao;
    }

LoginUtil:

 private Usuario usuario;
    private SecurityContext context = SecurityContextHolder.getContext();
    private Authentication authentication = context.getAuthentication();

    public LoginUtil() {
    }

    public void logar() {
        usuario = new Usuario();
        
        if (context instanceof SecurityContext) {            
            if (authentication instanceof Authentication) {
                usuario.setLogin(((User) authentication.getPrincipal()).getUsername());
            }
        }
    }

    public void deslogar() {        
        
        if (authentication.getPrincipal() instanceof Usuario) {
            final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

            SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();
            logoutHandler.setInvalidateHttpSession(true);
            logoutHandler.logout(request, null, authentication);            
        }
    }

applicationContext.xml

LOGOUT:

<p:commandButton styleClass="botao_menu" value="Sair" image="ui-icon-power" action="#{usuarioController.logout}" ajax="false"/>

Sua implementação está diferente da minha, não conheço essa forma.

Tente utilizar o logout como antes, porém no backBean.
ex:

public void deslogar() throws ServletException, IOException {
       ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
       RequestDispatcher dispatcher = ((ServletRequest) context.getRequest()).getRequestDispatcher("/j_spring_security_logout");
       dispatcher.forward((ServletRequest) context.getRequest(), (ServletResponse) context.getResponse());
       FacesContext.getCurrentInstance().responseComplete();	    
}

Dê uma olha nesse tutoriais

http://ocpsoft.com/java/acegi-spring-security-jsf-login-page/
http://facestutorials.icefaces.org/tutorial/spring-security-basic.html
http://www.mularien.com/blog/2008/07/07/5-minute-guide-to-spring-security/

e também documentação:
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity-single.html

Daniel, valeu pela ajuda e pelas dicas.

Tentei melhorar meu sistema de login, baseado nos links que voce me mandou, mas ainda estou com uma grande dificuldade em consertar o seguinte problema:

Da maneira como eu implementei o meu applicationContext.xml

<http 
        auto-config="true" 
        use-expressions="true"
        access-denied-page="/acessoNegado.sgm">
                
        <intercept-url pattern="/index.sgm" access="hasRole('ROLE_ADMIN')"/>
        <form-login login-page="/login.sgm" authentication-failure-url="/login.sgm?erro=true"/>              
    </http>  

A única página que me pede o login é a index.sgm, se eu digitar na mão teste.sgm, por exemplo, eu consigo acessar sem problema nenhum, mesmo sem estar logado. O que eu quero é que todas as minhas páginas (*.sgm) entrasse nessa intercept-url, para que sempre que alguém tentasse acessar alguma url diretamente, forçando na mão, ele seria redirecionado para minha página de login, caso não estivesse logado ou não tivesse permissão.
Não estou conseguindo fazer isso, está sempre dando um loop ou o projeto não roda, dizendo que o módulo não foi implementado.

Em um dos links que me enviou, está sendo feito isso:

<intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" />
É mais ou menos isso que eu quero, o problema é que não funciona, ele não reconhece esse comando ‘IS_AUTHENTICATED_ANONYMOUSLY’, e quando eu coloco duas permissões (ROLE_USER e ROLE_ADMIN) também não funciona.

Como posso resolver isso? Como posso redirecionar o usuário para o login em todas as páginas do sistema, pois no meu caso, mostrado acima, ele só é redirecionado para o login, se tentar acessar a pagina index.sgm

Jefferson,
Da uma olhada nesse link, está bem completo, ele explica como funcionam as regras de controle de acesso e também como alterá-las.
http://www.javasimples.com.br/spring-2/spring-security-3-deixando-sua-aplicacao-web-segura/

Qualquer coisa posta aí.

Daniel,

Valeu pela ajuda, consegui evoluir um pouco aqui. Fiz assim:

  <intercept-url pattern="/**.sgm" access="ROLE_USER,ROLE_ADMIN" />
  <intercept-url pattern="/**.xhtml" access="ROLE_USER,ROLE_ADMIN" /> 

Mas mesmo assim não está com restrição em todas as páginas do meu sistema. Por exemplo, se eu crio um diretório cadastro, eu consigo acessar os arquivos desse diretório diretamente na mão, para que a restrição funcione eu tenho que adicionar uma nova intercept-url, ficando assim:

<intercept-url pattern="/cadastros/**" access="ROLE_USER,ROLE_ADMIN" />        

É assim mesmo? Eu tenho, sempre que criar um diretório novo, adicionar uma restrição para ele?