我正在运行 Wildfly 并且在用户注销时使 session 无效的问题。我已经设置了一个自定义数据库登录模块并且可以正常工作,但是注销功能却没有。我已经粘贴了相关的 standalone.xml、jboss-web.xml 和我的 servlet 注销代码。
问题是注销后 session 不会失效。使用相同的 JSESSIONIDSSO cookie,用户即使在注销后仍然可以访问需要角色的页面。我已经测试过角色是否正常工作 - 在登录之前,需要角色的页面是无法访问的。登录后即可访问。注销后,它们仍然可以访问。
有没有其他人遇到过这些问题,或者您知道我的配置有误吗?
独立文件
<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());
}
}
最佳答案
我使用的是 Wildfly-8.1,而且 SSO 也有很多问题。首先,如前所述,当 session 被销毁时,您需要手动刷新缓存:
@WebListener
public class SessionListener implements HttpSessionListener {
@Resource(name = "java:jboss/jaas/app/authenticationMgr")
private CacheableManager<?, Principal> authenticationManager;
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
// Flushes credentials.
Principal principal = (Principal) httpSessionEvent.getSession()
.getAttribute("principal");
if (principal != null) {
authenticationManager.flushCache(principal);
}
}
}
Wildfly 已将默认 Web 容器切换为 Undertow,因此无法再使用 Valve。您可以从 jboss-web.xml 中删除该部分
要启用 SSO,您需要编辑 standalone.xml 并在 undertow 子系统中添加“单点登录”选项(SSO 是按主机配置的):
<subsystem xmlns="urn:jboss:domain:undertow:1.1">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
<single-sign-on path="/"/>
</host>
</server>
<servlet-container name="default">
<jsp-config/>
</servlet-container>
<handlers>
<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
</handlers>
<filters>
<response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
<response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
</filters>
</subsystem>
但仍然不够,因为我必须注销两次才能注销。在此论坛上关注和讨论后:Wildfly SSO, does it support session timeout and logout? 我不得不使用此论坛上的修复程序修补 Undertow 模块并将其安装在 Wildfly-8.1 中
关于java - Wildfly SSO 注销不起作用 - session 仍然有效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22821299/