Logout não desliga usuário logado

Java

02/06/2012

Estou aplicando o LOGOUT através deste comando:
javascript: window.location=j_spring_security_logout

Ele funciona em parte. Obs.:As informações do usuário logado não são apagadas.

Como faço para que o LOGOUT apague as informações do usuário logado?
Permitindo que um outro usuário novo entre no sistema, sem nenhum vestígio do usuário logado anteriormente?

Régis.

Régis Santos

Régis Santos

Curtidas 0

Respostas

Régis Santos

Régis Santos

02/06/2012

Outras informações importantes:
- Uso o MOJARRA;
- JSF 2.0
- JSP
- SPRING SECURITY 3
- Java 1.6
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/06/2012

Obtenha o objeto Session do tipo HttpSession e chame o método invalidate que vai limpar todos os dados da seção e criar uma nova.

att
robson
GOSTEI 0
Davi Costa

Davi Costa

02/06/2012

Posta suas configurações do spring-security e se possível o página que contém o form que vc se desloga, desconfio que seja alguma bronca por ai.

att Davi
GOSTEI 0
Régis Santos

Régis Santos

02/06/2012


topoBarraFerramentas.xhtml:

<ui:composition>
<h:panelGrid columns=3 width=100% id=toolBar styleClass=menuNormalVerdePequeno>
<h:panelGrid columns=3>
<h:graphicImage url=# width=50 height=50 alt=globo/>
<h:outputText value=Régis styleClass=genericoLabelAmarelo ></h:outputText>
<h:outputText value=E-Commerce styleClass=genericoLabelBranco ></h:outputText>
</h:panelGrid>
<h:panelGrid columns=15 width=100% styleClass=menuNormalVerdePequeno>
<h:outputText value=12345 styleClass=menuNormalVerdePequeno ></h:outputText>
<h:outputText value=#{msg.menu_selecaoProdutos} styleClass=# ></h:outputText>
<h:outputText value=123 styleClass=menuNormalVerdePequeno ></h:outputText>
<h:outputText value=#{msg.menu_carrinhoCompras} styleClass=# ></h:outputText>
<h:outputText value=123 styleClass=menuNormalVerdePequeno ></h:outputText>
<h:outputText value=#{msg.menu_entrega} styleClass=# ></h:outputText>
<h:outputText value=123 styleClass=menuNormalVerdePequeno ></h:outputText>
<h:outputText value=#{msg.menu_pagamento} styleClass=# ></h:outputText>
<h:outputText value=123 styleClass=menuNormalVerdePequeno ></h:outputText>
<h:outputText value=#{msg.menu_aprovacao} styleClass=# ></h:outputText>
<h:outputText value=123 styleClass=menuNormalVerdePequeno></h:outputText>
<h:commandLink id=cmdConta action=#{barraFerramentasBean.chamarCliente} value=>
<f:setPropertyActionListener value=false
target=#{opcoesSelecionarBean.isIdentificar}/>
<f:setPropertyActionListener value=#
target=#{opcoesSelecionarBean.menuAnterior}/>
<f:setPropertyActionListener value=#
target=#{opcoesSelecionarBean.nomeMenuAnterior}/>
<h:graphicImage url=#{localeBean.imagemConta} styleClass=genericoImagemMiniaturaLog/>
</h:commandLink>
<h:panelGrid width=100% columns=1
rendered=#{barraFerramentasBean.isLogado} >
<h:panelGrid styleClass=alinhamentoCentralizado columns=1>
<h:outputText value=#{barraFerramentasBean.nomeClienteLogado} styleClass=menuNormalPequenoAmarelo/>
<h:outputText value=#{msg.cliente_conta1} styleClass=menuNormalBrancoPequeno/>
<h:outputText value=#{msg.cliente_conta2} styleClass=menuNormalBrancoPequeno/>
</h:panelGrid>
</h:panelGrid>
<h:panelGrid width=100% columns=1 rendered=#{barraFerramentasBean.isLogado == false}>
<h:commandLink id=idLogin action=#{barraFerramentasBean.chamarLoginIda}
styleClass=genericoLabelAzulTamMedio>
<f:setPropertyActionListener value=#
target=#{localeBean.loginRetorno}/>
<f:setPropertyActionListener value=true
target=#{clienteBean.isNovaChamada}/>
<f:setPropertyActionListener value=true
target=#{clienteBean.isNovaChamadaEntrega}/>
<f:setPropertyActionListener value=true
target=#{vendaCompraBean.isNovaChamada}/>
<h:graphicImage url=#{localeBean.imagemSignin} styleClass=genericoImagemMiniaturaLog/>
</h:commandLink>
</h:panelGrid>
<h:panelGrid width=100% columns=1 rendered=#{barraFerramentasBean.isLogado}>
<h:commandLink id=idLogout action=#{barraFerramentasBean.chamarLogoutAux}>
<f:setPropertyActionListener value=#
target=#{localeBean.caminhoLogout}/>
<h:graphicImage url=#{localeBean.imagemSignout} styleClass=genericoImagemMiniaturaLog/>
</h:commandLink>
</h:panelGrid>

</h:panelGrid>
</h:panelGrid>
</ui:composition>



formulário vendas_selecionarProduto chamando o componente topoBarraFerramentas:

<h:form id=meuFormVendaSelecionarProduto>
<h:inputHidden id=idIniciar value=#{vendaSelecionarProdutoBean.iniciar}/>
<h:panelGrid width=100% columns=1>
<com:compBarraFerramentas id=idBarraFerramentas
styleSelecaoProduto=menuNegritoSelecionado
styleCarrinhoCompras=menuNormalBrancoMedio
styleEntrega=menuNormalBrancoMedio
stylePagamento=menuNormalBrancoMedio
styleAprovacao=menuNormalBrancoMedio
imagemGlobo=/imagens/globo1.jpg
imagemConta=/imagens/conta.jpg
imagemLogin =/imagens/login.jpg
imagemLogout = /imagens/logout.jpg
paramMenuAnterior=chamarSelecionarProduto
paramNomeMenuAnterior=#{msg.menu_selecaoProdutos}
paramLoginRetorno = venda_selecionarProduto.jsf
paramCaminhoLogout=javascript: window.location=j_spring_security_logout/>



formulário LogoutAux:

</head>
<body onload=#{localeBean.caminhoLogout}> <!-- chama aqui o comando de logout: -->
<f:view> <!-- javascript: window.location=j_spring_security_logout -->
<h:form> <!-- configurado por vendas_selecionarProduto e passando por -->
</h:form> <!-- topoBarraFerramentas -->
</f:view>
</body>





spring-config-security:

<?xml version=1.0 encoding=UTF-8?>
<beans:beans xmlns=http://www.springframework.org/schema/security
xmlns:beans=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd>

<http auto-config=true access-denied-page=/acessoNegado.jsp>
<logout invalidate-session=true logout-success-url=/locale.jsf/>
<intercept-url pattern=/usuarios/** access=ROLE_USUARIO, ROLE_ADMIN/>
<intercept-url pattern=/admin/** access=ROLE_ADMIN/>
<form-login login-page=/login.jsp authentication-failure-url=/login.jsp?login_error=true
default-target-url=/loginRetorno.jsf/>
</http>

<authentication-manager>
<authentication-provider user-service-ref=customUserService>
<password-encoder hash=md5/>
</authentication-provider>
</authentication-manager>

<beans:bean id=customUserService class=seguranca.CustomUserDetailsService>
<beans:property name=dataSource ref=dataSource/>
<beans:property name=usersByUsernameQuery value=SELECT usu.nome_usu as username,
usu.senha_usu as password, usu.ativo_usu as enabled FROM usuarios as usu WHERE nome_usu = ? />
<beans:property name=authoritiesByUsernameQuery value=SELECT usu.nome_usu as username,
per.descricao_per as authority FROM usuarios as usu JOIN usuarios_perfis as usuper
on usu.id_usu = usuper.id_usu JOIN perfis as per on usuper.id_per = per.id_per WHERE usu.nome_usu = ?
></beans:property>
</beans:bean>

<!-- Load in application properties reference -->
<beans:bean id=applicationProperties class=org.springframework.beans.factory.config.PropertyPlaceholderConfigurer>
<beans:property name=location value=application.properties/>
</beans:bean>

<beans:bean id=dataSourceSeg class=org.springframework.jdbc.datasource.DriverManagerDataSource>
<beans:property name=driverClassName><beans:value>${jdbc.driver.className}</beans:value></beans:property>
<beans:property name=url><beans:value>${jdbc.url}</beans:value></beans:property>
<beans:property name=username><beans:value>${jdbc.username}</beans:value></beans:property>
<beans:property name=password><beans:value>${jdbc.password}</beans:value></beans:property>
</beans:bean>

<beans:bean class=seguranca.EventListenerSenhaIncorreta>
<beans:property name=dataSource ref=dataSourceSeg/>
</beans:bean>

<beans:bean class=org.springframework.security.authentication.event.LoggerListener/>

</beans:beans>

Obrigado. Régis.
GOSTEI 0
Davi Costa

Davi Costa

02/06/2012

tenta fazer essa chamada para se deslogar:
<a href=#{request.contextPath}/j_spring_security_logout title=Sair>Sair</a>

Apesar de quê pareceu estar tudo correto.
Esse seu arquivo está ok né: application.properties?


att Davi
GOSTEI 0
Régis Santos

Régis Santos

02/06/2012

Eu usei o que você me disse mas continua permanecendo o mesmo usuário logado, sem apagá-lo.

Veja outra classe e parte de código que eu uso.


public class UsuarioUtil {

public final static String VAZIO = ;
public final static Integer ZERO = 0;

public UsuarioUtil(){

}

public static String getNomeUsuarioLogado(){
String nomeUsuario = VAZIO;
if (getUsuarioLogado() != null){
Usuario usuario = getUsuarioLogado();
nomeUsuario = usuario.getUsername();
}
return nomeUsuario;
}

private static Usuario getUsuarioLogado(){
Authentication authentication =
(Authentication)SecurityContextHolder.
getContext().getAuthentication();
Usuario usuario = new Usuario();
if(authentication == null){
usuario = null;
} else{
usuario.setLogin(authentication.getName());
usuario.setAuthorities((authentication.getAuthorities()));
}
return usuario;
}
}



application.properties:

jdbc.driver.className=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/BdVendas
jdbc.username=postgres
jdbc.password=postgres
jdbc.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

GOSTEI 0
Davi Costa

Davi Costa

02/06/2012

Esse ultimo trecho ai está sem problemas tb, posta essa classe:
CustomUserDetailsService

att Davi
GOSTEI 0
Régis Santos

Régis Santos

02/06/2012

package seguranca;

import java.sql.ResultSet;
import java.sql.SQLException;


import org.springframework.jdbc.core.RowMapper;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;

public class CustomUserDetailsService extends JdbcDaoImpl {

public CustomUserDetailsService(){

}

protected UserDetails createUserDetails(String username,
UserDetails userFromUserQuery,
GrantedAuthority[] combinedAuthorites){
Usuario usuario = new Usuario();
usuario.setLogin(userFromUserQuery.getUsername());
usuario.setSenha(userFromUserQuery.getPassword());
usuario.setAtivo(userFromUserQuery.isEnabled());
usuario.setAuthorities(userFromUserQuery.getAuthorities());
carregarInformacoesAdicionais(usuario);
return usuario;
}

private void carregarInformacoesAdicionais(final Usuario usuario) {
this.getJdbcTemplate().queryForObject(
select email_usu, tentativaslogin_usu from usuarios where nome_usu = ? ,
new Object[]{usuario.getUsername()},
new RowMapper<Usuario>() {
public Usuario mapRow(ResultSet rs, int rowNum) throws SQLException {
usuario.setEmail(rs.getString(email_usu));
usuario.setTentativasLogin(rs.getInt(tentativaslogin_usu));
return usuario;
}
});
}
}
GOSTEI 0
Régis Santos

Régis Santos

02/06/2012

package seguranca;

import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;

public class SegurancaUsuario extends org.springframework.security.core.userdetails.User {

private static final long serialVersionUID = 7486877876023620745L;

private Usuario usuario;

public Usuario getUsuario() {
return usuario;
}

public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}

public SegurancaUsuario(String nomeUsuario, String senha, boolean ativo,
boolean accountNonExpired, boolean credentialsNonExpired,
boolean accountNonLocked, Collection<GrantedAuthority> authorities)
throws IllegalArgumentException {
super(nomeUsuario, senha, ativo, accountNonExpired,
credentialsNonExpired, accountNonLocked, authorities);
}

}
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/06/2012

Kra sugiro que você implemente o seguinte trecho de codigo em um método de sua managedBean.

HttpSession session =((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession();
session.invalidate();

e que o link ou botão que você usa
para realizar o logoff chame também o comando js javascript: window.location=j_spring_security_logout.

pois assim o spring security vai executar as configurações para deslogar e também ao invalidar a session vai tirar todo
e qualquer tipo de dado que possa ter ficado na session.

espero ter ajudado.
att
robson
GOSTEI 0
Régis Santos

Régis Santos

02/06/2012

Obrigado a todos pela contribuição ao meu problema.

Eu já resolvi esta questão.

Eu havia cometido um erro na criação do meu código ao logar no sistema.


Régis.
GOSTEI 0
Davi Costa

Davi Costa

02/06/2012

Show de bola Regis!
O Spring-security deve fazer todo o tratamento com respeito a segurança e sessão, abstraindo para o desenvolvimento apenas suas regras de negócio a nível de segurança e autorização.


att Davi
GOSTEI 0
POSTAR