Java Wildfly SSO注销不工作-会话仍然有效
我正在运行Wildfly,并且在用户注销时使会话无效方面存在问题。我已经设置了一个自定义数据库登录模块,该模块可以工作,但注销功能无法工作。我已经粘贴了相关的standalone.xml、jboss-web.xml和servlet注销代码 问题是会话在注销后不会失效。使用相同的JSESSIONIDSSO cookie,用户即使在注销后仍然可以访问需要角色的页面。我已经测试了角色是否正常工作-在登录之前,需要角色的页面无法访问。登录后,可以访问它们。注销后,它们仍然可以访问 有没有其他人经历过这些问题,或者你知道我这边有什么错误的配置 standalone.xmlJava Wildfly SSO注销不工作-会话仍然有效,java,jboss,wildfly,Java,Jboss,Wildfly,我正在运行Wildfly,并且在用户注销时使会话无效方面存在问题。我已经设置了一个自定义数据库登录模块,该模块可以工作,但注销功能无法工作。我已经粘贴了相关的standalone.xml、jboss-web.xml和servlet注销代码 问题是会话在注销后不会失效。使用相同的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>
它似乎与JIRA问题有关,这在Wildfly 8中尚未解决,但仅在9中解决。我正在使用Wildfly-8.1,而且我在SSO方面也有很多问题。首先,如前所述,当会话被破坏时,您需要手动刷新缓存:
@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);
}
}
}
@WebListener
公共类SessionListener实现了HttpSessionListener{
@资源(name=“java:jboss/jaas/app/authenticationMgr”)
private CacheableManager我也有同样的问题
我已经从Wildfly8.1.0.Final更新到Wildfly8.2.0.Final,问题已经解决。您是否检查了invalidate()
是否实际删除了JSESSIONID
?我看到的另一种可能性是,JSF存在干扰,因为您必须从受保护的页面(您注销的页面)重定向转到未受保护的页面(以显示“注销”消息)。如果没有干净的转换,JSF将恢复它知道的会话,从而破坏注销过程。它似乎没有删除它。JSESSIONID
和JSESSIONIDSSO
仍然有效(它们不会从客户的cookie中删除)当我访问受保护的页面时。我确实将其重定向到不需要角色的登录页面,因此我认为这是一个干净的转换。这可能与您过期的情况不同,但我对wildfly 8.0.0和FlushonSessionInvalization有一些问题。当您使会话无效时,wildfly不会为用户清理角色缓存t已通过身份验证(这可能是您的问题造成的),这是计划在9.0.0中修复的错误,同时您可以检查此解决方法:。我还在一个wildfly论坛上读到,版本8.1已修复了许多SSO错误。
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());
}
}
@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);
}
}
}
<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>