身份验证为匿名的用户尝试访问所拥有的会话

时间:2015-10-20 18:28:07

标签: session java-ee websphere-8 ltpa

在我登录之前,我可以点击安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。正如您所料。

登录后,我可以开展我的业务,​​并在我的安全约束之外和内部点击资源。

但是,当LTPA令牌过期(仍然有一个活动会话)并且我尝试转到一个不受限制的页面时,让我们说要重定向到登录页面,我会在标题中看到错误。

我想弄清楚一些事情: 1.我可以让LTPA令牌不像我的会话那样过期吗? 2. LTPA令牌可以使我的会话到期吗? 3.为什么我不能匿名访问不受限制的页面?它清楚地意识到我的LTPA令牌已过期,并试图将我重定向到登录。它失败了。

好的,所以有一个过滤器的地方。过滤器会重定向尚未登录到登录页面的人。但问题是,只要ltpa令牌过期,此行就会失败((HttpServletRequest) request).getSession(false)在标题UnauthorizedSessionRequestException中抛出异常。所以你可以看到我试图捕获该错误并进行注销。其中,woops,抛出另一个UnauthorizedSessionRequestException。那么我怎么不使用会话?

@Override
public void doFilter(final ServletRequest request, final ServletResponse response,
    final FilterChain chain) throws IOException, ServletException
{
    final String sourceMethod = "doFilter";
    if (logger.isLoggable(Level.FINER)) {
        logger.entering(sourceClass, sourceMethod, new Object[] { request, response, chain });
    }

    try {
        final HttpSession session = ((HttpServletRequest) request).getSession(false);
        final UserBean user = (session != null) ? (UserBean) session.getAttribute("userBean")
            : null;
        if (user == null || (user != null && !user.isLoggedOn())) {
            final HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("../login.jsf");
        } 
    } catch (final UnauthorizedSessionRequestException exc) {
        ((HttpServletRequest) request).logout();
        final HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect("../login.jsf");
    } catch (final Exception exc) {
        final ServletException exception = new ServletException(
            "[UserBeanFilter] Exception doFilter.", exc);
        logger.throwing(sourceClass, sourceMethod, exception);
        throw exception;
    }
    chain.doFilter(request, response);
    logger.exiting(sourceClass, sourceMethod);
}

2 个答案:

答案 0 :(得分:1)

我可以让LTPA令牌不会像我的会话一样过期吗?

不幸的是没有。 LTPA令牌具有固定的超时,并且会话具有不活动超时。如果需要,您可以将LTPA令牌超时延长至8小时以避免过期。

为什么我无法匿名访问不受限制的网页?

因为它尝试访问以前与经过身份验证的用户关联的会话。您可以通过在 923.03 中停用Security integration设置来允许匿名访问会话。

您还可以检查Servers > Server Types > WebSphere application servers > server_name > Session management中是否启用了Use available authentication data when an unprotected URI is accessed

它清楚地意识到我的LTPA令牌已过期并尝试将我重定向到登录状态。它失败了。

尝试在登录页面上禁用会话支持,如果是jsp,则尝试在页面中设置Security > Global security > Authentication > Web and SIP security > General settings

<强>更新

因此,如果您想要预防性,您可以检查LTPA过期,并在令牌过期前基于该注销用户,例如5分钟之前。当然,如果用户在5分钟内处于非活动状态,您仍然可以获得该例外,但对于90%的情况应该是足够的。

要使令牌过期,请使用以下代码(伪代码):

<@page session="false">

更新2

好的,我找到了更好的解决方案。

只需在会话管理器中设置以下标志:

WSSubject subject = WSSubject.getRunAsSubject(); Set<WSCredential> credentials = subject.getPublicCredentials(WSCredential.class); for(WSCredential credential : credentials) { // in the most cases you will find only one credential, but if you // want to be sure you can check credential OID System.out.println("Exp date:" + new Date(credential.getExpiration())); System.out.println("userName: " + credential.getSecurityName()); System.out.println("cred: " + credential.getOID()); // if expiration date closer than your threshold - logout user // ... } OIDs for auth mechanisms BasicAuth (GSSUP): oid:2.23.130.1.1.1 KRB5: OID: 1.2.840.113554.1.2.2 LTPA: oid:1.3.18.0.2.30.2

  

<强> InvalidateOnUnauthorizedSessionRequestException

     

如果为了响应未经授权的请求,将此属性设置为true   您希望会话管理器使会话无效而不是   发出UnauthorizedSessionRequestException错误消息。

     

当会话失效时,请求者可以创建一个新会话,   但无法访问任何以前保存的会话数据。   此无效允许单个用户继续处理请求   注销后仍然保护会话数据。

请参阅此处Session management custom properties

中的详细信息

答案 1 :(得分:0)

适用于Webshepre 8.5。转到服务器&gt;服务器类型&gt; WebSphere应用程序服务器&gt; server_name(server1)&gt;会话管理。(查看右侧菜单) 自定义属性 - &gt;添加新属性

Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.

保存并在eclipse中重启服务器。 我在SOAPUI中测试webservice时遇到了这个问题。