【发布时间】:2014-04-02 19:35:51
【问题描述】:
我正在运行 Wildfly,并且在用户注销时遇到了使会话无效的问题。我已经设置了一个自定义数据库登录模块并且可以正常工作,但是注销功能不起作用。我已经粘贴了相关的standalone.xml、jboss-web.xml 和我的servlet 注销代码。
问题是会话在注销后不会失效。使用相同的 JSESSIONIDSSO cookie,用户即使在注销后仍然可以访问需要角色的页面。我已经测试了角色是否正常工作 - 在登录之前,需要角色的页面无法访问。登录后,它们可以访问。注销后,它们仍然可以访问。
有没有其他人遇到过这些问题,或者您知道我的配置错误吗?
独立的.xml
<security-domain name="myname-form" cache-type="default">
<authentication>
<login-module code="com.myname.DatabaseModLoginModule" flag="sufficient">
<module-option name="securityDomain" value="jsse-myname"/>
<module-option name="verifier" value="com.myname.X509Verifier"/>
<module-option name="dsJndiName" value="java:/jdbc/myds"/>
<module-option name="rolesQuery" value="exec h_Get_UserRoles ?, 1"/>
<module-option name="fieldToSearchMap" value="CN=TEST"/>
<module-option name="logQuery" value="exec h_Log_login_Attempt ?,?"/>
<module-option name="certLogDir" value="C:\tools\wildfly\standalone\log\failedcerts"/>
</login-module>
</authentication>
</security-domain>
jboss-web.xml
<jboss-web>
<security-domain flushOnSessionInvalidation="true">myname-form</security-domain>
<valve>
<class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
</valve>
<context-root>/myname-form</context-root>
</jboss-web>
ServletLogout.java
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Cache-Control", "no-cache, no-store");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", new java.util.Date().toString());
if (request.getSession(false) != null) {
request.getSession(false).invalidate();
}
if (request.getSession() != null) {
request.getSession().invalidate();
}
request.logout();
response.sendRedirect(request.getScheme()+"://"+request.getServerName());
}
}
【问题讨论】:
-
您是否检查过
invalidate()实际上正在删除JSESSIONID?我看到的另一种可能性是来自 JSF 的干扰,因为您必须从受保护的页面(您注销的地方)重定向到不受保护的页面(以显示“注销”消息)。如果您没有干净的转换,JSF 将恢复它知道的会话,从而破坏注销过程。 -
它似乎没有删除它。当我访问受保护的页面时,
JSESSIONID和JSESSIONIDSSO仍然有效(它们不会从客户端的 cookie 中删除)。我确实让它重定向到不需要角色的登录页面,所以我认为这是一个干净的过渡。 -
这可能与您遇到的情况不同,但我在使用 wildfly 8.0.0 和 flushOnSessionInvalidation 时遇到了一些问题。当您使会话无效时,wildfly 不会为已通过身份验证的用户清除角色缓存(这可能是您的问题的原因),这是计划在 9.0.0 中修复的错误,同时您可以检查此解决方法:stackoverflow.com/questions/21931637/…。我还在一个 Wildfly 论坛上读到,8.1 版修复了许多 SSO 错误。