2

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

登录后,我可以开展我的业务,​​并在我的安全约束内外访问资源。

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

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

好的,所以有一个过滤器。过滤器将未登录的人重定向到登录页面。但是问题再次出现,一旦 ltpa 令牌过期,这条线就无法((HttpServletRequest) request).getSession(false)在标题中抛出异常,UnauthorizedSessionRequestException. 如您所见,我试图捕捉该错误并注销。哪一个,糟糕,又抛出一个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);
}
4

2 回答 2

3

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

抱歉不行。LTPA 令牌具有固定超时,会话具有非活动超时。如果需要,您可以将 LTPA 令牌超时时间延长到 8 小时,以避免过期。

为什么我不能匿名访问不受限制的页面?

因为它试图访问以前与经过身份验证的用户关联的会话。Security integration您可以通过禁用设置 来允许匿名访问会话Servers > Server Types > WebSphere application servers > server_name > Session management

您还可以检查是否Use available authentication data when an unprotected URI is accessedSecurity > Global security > Authentication > Web and SIP security > General settings.

它清楚地认识到我的 LTPA 令牌已过期并试图将我重定向到登录。在这一点上它失败了。

尝试在您的登录页面上禁用会话支持,如果是 jsp 则尝试<@page session="false">在页面中设置。

更新

因此,如果您想采取预防措施,您可以检查 LTPA 到期,并在令牌到期之前基于该注销用户,例如 5 分钟前。当然,如果用户在那 5 分钟内处于非活动状态,您仍然会收到该异常,但对于 90% 的情况应该足够了。

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

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 

更新 2

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

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

InvalidateOnUnauthorizedSessionRequestException=true

InvalidateOnUnauthorizedSessionRequestException

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

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

在此处查看详细信息会话管理自定义属性

于 2015-10-21T08:04:53.270 回答
0

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

Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.

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

于 2018-01-01T13:26:49.543 回答