Boa noite!
Estou com uma dúvida a respeito de como o spring security trata o logout e as sessions da aplicação.
Tenho pesquisado sobre o assunto nos últimos 2 dias e, apesar das inúmeras soluções propostas, nenhuma resolveu o meu problema.
Minha lib conta com os seguintes jars: commons-logging/ mysql-conector / spring framework 3.1 / spring security 3.0.7
Tenho os seguintes artefatos na minha aplicação:
index.xhtml (arquivo simples que aponta para as áreas de usuário e de administrador)
[code]<?xml version="1.0" encoding="UTF-8"?>
Home PagePágina de Boas Vindas
Área de UsuáriosÁrea de Administradores [/code]
login.xhtml (página de login chamada pelo spring security quando se tenta acessar uma página protegida)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Autenticação</title>
</head>
<body>
<form action="j_spring_security_check" method="post">
Usuário: <input type="text" name="j_username" /><br/>
Senha: <input type="text" name="j_password"/><br/>
<input type="submit" value="Efetuar Login"/>
</form>
<br /><br />
<a href="index.xhtml">Retornar para a Página Inicial</a>
</body>
</html>
falha.xhtml (arquivo chamado quando há falha na autenticação)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Falha na tentativa de login</title>
</head>
<body>
<div>Login e/ou senha inválidos!</div>
<br/>
<a href="index.xhtml">Retornar para a Página Inicial</a>
</body>
</html>
usuario/index.xhtml (página que exige ROLE_USER ou ROLE_ADMIN para ser acessada)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Área do Usuário</title>
</head>
<body>
<h1>Bem Vindo a Área de Usuários</h1>
<a href="../index.xhtml">Retornar para a Página Inicial</a>
<br />
<a href="../logout">Sair</a>
</body>
</html>
administrador/index.xhtml (página que exige a ROLE_ADMIN para ser acessada)
[code]<?xml version="1.0" encoding="UTF-8"?>
Área do AdministradorBem Vindo a Área de Administradores
Retornar para a Página InicialSair [/code]
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
applicationContext.xml (arquivo de configuração do spring security)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<!-- data source -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/security" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<sec:http auto-config="true">
<sec:form-login login-page="/login.xhtml" authentication-failure-url="/falha.xhtml" />
<sec:logout invalidate-session="true" logout-success-url="/index.xhtml" logout-url="/logout"/>
<sec:intercept-url pattern="/usuario/**" access="ROLE_USER,ROLE_ADMIN" />
<sec:intercept-url pattern="/administrador/**" access="ROLE_ADMIN" />
<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</sec:http>
<sec:authentication-manager>
<sec:authentication-provider>
<sec:jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT username, password, 'true' as enable FROM users WHERE username=?"
authorities-by-username-query="SELECT username, authority FROM users WHERE username=?" />
</sec:authentication-provider>
</sec:authentication-manager>
</beans>
*netbeans, glassfish 3.1
Alguns fluxos de execução apresentados pela configuração acima:
fluxo 1:
index.xhtml carregado
requisição para usuario/index.xhtml
página de login apresentada
login de usuário efetuado
área de usuario aberta
tentativa de logout (botão sair)
index.xhtml apresentado
requisição para usuario/index.xhtml
página de usuário aberta sem autenticação
fluxo 2:
index.xhtml carregado
requisição para administrador/index.xhtml
página de login apresentada
login de administrador efetuado
área de administrador aberta
tentativa de logout (botão sair)
index.xhtml apresentado
requisição para administrador/index.xhtml
página de administrador aberta sem autenticação
O filtro funciona corretamente. Todas as roles são respeitadas(de início). Não consigo, por exemplo, acessar a área de administrador com um usuário com role user.
O problema é que não consigo fazer com que o spring security mate a sessão. Não consigo fazer o logout nem com reza braba .
Alguém tem experiência nisso? Já passou por algo parecido?
Estou a procura de sugestões!
Caso esteja descumprindo alguma regra, desculpe.
Grato.