【问题标题】:Wildfly SSO Logout Not Working - Session is Still ValidWildfly SSO 注销不工作 - 会话仍然有效
【发布时间】: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 将恢复它知道的会话,从而破坏注销过程。
  • 它似乎没有删除它。当我访问受保护的页面时,JSESSIONIDJSESSIONIDSSO 仍然有效(它们不会从客户端的 cookie 中删除)。我确实让它重定向到不需要角色的登录页面,所以我认为这是一个干净的过渡。
  • 这可能与您遇到的情况不同,但我在使用 wildfly 8.0.0 和 flushOnSessionInvalidation 时遇到了一些问题。当您使会话无效时,wildfly 不会为已通过身份验证的用户清除角色缓存(这可能是您的问题的原因),这是计划在 9.0.0 中修复的错误,同时您可以检查此解决方法:stackoverflow.com/questions/21931637/…。我还在一个 Wildfly 论坛上读到,8.1 版修复了许多 SSO 错误。

标签: java jboss wildfly


【解决方案1】:

我使用的是 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);
        }
    }
}

Wildfly 已将默认 Web 容器切换为 Undertow,因此不能再使用 Valve。您可以从 jboss-web.xml 中删除该部分

要启用 SSO,您需要编辑standalone.xml 并在 undertow 子系统中添加“single-sign-on”选项(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 中

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    我已经从 Wildfly8.1.0.Final 更新到 Wildfly8.2.0.Final 并且问题消失了。

    【讨论】:

      【解决方案3】:

      似乎它与this JIRA 问题有关,Wildfly 8 中尚未解决,但仅在 9 中。

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2014-06-15
        • 2014-04-06
        • 2019-02-11
        • 1970-01-01
        • 2021-10-17
        • 2012-05-16
        • 2021-03-14
        • 1970-01-01
        相关资源
        最近更新 更多