Session 身份验证为匿名的用户试图访问拥有的会话
在登录之前,我可以访问安全约束目录之外的任何内容。如果我试图转到安全约束目录中的某个位置,它会将我重定向到表单登录页面。如你所料 一旦登录,我就可以继续我的业务,并访问安全约束内外的资源 但是,当LTPA令牌过期(仍然有一个活动会话)并且我尝试转到一个不受限制的页面时,比如说像被重定向到登录页面一样,我在标题中得到了错误 所以我想弄清楚几件事: 1.我可以让LTPA令牌不象我的会话那样过期吗? 2.当LTPA令牌过期时,我可以使会话过期吗? 3.为什么我不能匿名访问不受限制的页面?它清楚地认识到我的LTPA令牌已过期,并试图将我重定向到登录。在这一点上,它失败了 好的,那就找个有过滤器的地方。筛选器将未登录的用户重定向到登录页面。但是问题再次出现,只要ltpa令牌过期,这一行就会失败Session 身份验证为匿名的用户试图访问拥有的会话,session,jakarta-ee,websphere-8,ltpa,Session,Jakarta Ee,Websphere 8,Ltpa,在登录之前,我可以访问安全约束目录之外的任何内容。如果我试图转到安全约束目录中的某个位置,它会将我重定向到表单登录页面。如你所料 一旦登录,我就可以继续我的业务,并访问安全约束内外的资源 但是,当LTPA令牌过期(仍然有一个活动会话)并且我尝试转到一个不受限制的页面时,比如说像被重定向到登录页面一样,我在标题中得到了错误 所以我想弄清楚几件事: 1.我可以让LTPA令牌不象我的会话那样过期吗? 2.当LTPA令牌过期时,我可以使会话过期吗? 3.为什么我不能匿名访问不受限制的页面?它清楚地认识到
((HttpServletRequest)请求)。getSession(false)
在标题中抛出异常,UnauthorizedSessionRequestException
。如你所见,我试图捕捉错误并注销。woops,这会引发另一个未经授权的SessionRequestException
。那么,我如何才能不使用该会话呢
@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);
}
我可以让LTPA令牌不象我的会话一样过期吗?
不幸的是,没有。LTPA令牌具有固定超时,会话具有非活动超时。如果需要,可以将LTPA令牌超时时间延长到8小时,以避免过期
为什么我不能匿名访问不受限制的页面?
因为它尝试访问以前与已验证用户关联的会话。通过禁用Servers>Server Types>websphereapplicationservers>Server\u name>sessionmanagement
中的securityintegration
设置,您可以允许匿名访问会话
您还可以检查在访问未受保护的URI时是否使用可用的身份验证数据在Security>Global Security>authentication>Web和SIP Security>General settings
中启用了
它清楚地意识到我的LTPA令牌已过期,并试图将我重定向到登录。此时它会失败。
尝试在登录页面上禁用会话支持,如果是jsp,则尝试在页面中设置
更新
因此,如果您想预防性地检查LTPA过期,可以根据令牌过期之前的注销用户检查LTPA过期,例如5分钟之前。当然,如果用户在这5分钟内处于非活动状态,您仍然会得到该异常,但对于90%的情况,它应该足够了
要获取令牌的到期时间,请使用以下代码(伪代码):
WSSubject-subject=WSSubject.getRunAsSubject();
设置凭据=subject.getPublicCredentials(WSCredential.class);
用于(WSCredential凭据:凭据){
//在大多数情况下,您只能找到一个凭证,但如果您
//要确保您可以检查凭据OID吗
System.out.println(“Exp-date:+新日期(credential.getExpiration()));
System.out.println(“用户名:”+credential.getSecurityName());
System.out.println(“cred:+credential.getOID());
//如果过期日期比您的阈值近-注销用户
// ...
}
身份验证机制的OID
BasicAuth(GSSUP):oid:2.23.130.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错误消息
当会话无效时,请求者可以创建一个新会话,
但无权访问以前保存的任何会话数据。
此失效允许单个用户继续处理请求
注销后,仍在保护会话数据
有关Webshepre 8.5,请参见此处的详细信息。转到服务器>服务器类型>WebSphere应用程序服务器>服务器名称(server1)>会话管理。(查看右侧菜单)
自定义属性->添加新属性
Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.
保存它并在eclipse中重新启动服务器。
在SOAPUI中测试webservice时,我遇到了这个问题。这个jsf是如何相关的?你的问题与itIt的JSF应用程序没有任何关系,我认为这是相关信息。如果它与问题相关,那么它是相关的。你还可以加上“爪哇”、“能源”、“全球变暖”(由燃烧运行爪哇所需能源的化石燃料引起;-)。请删除它,我不同意。JSF意味着“java”、“能源”、“全球变暖”(由燃烧运行java所需的化石燃料引起;-)。Websphere-8和LTPA并不意味着我们试图在看到错误的平台上运行什么类型的应用程序。关键是,您的帖子中没有任何内容指出这个问题与jsf相关,甚至没有一行jsf代码。使用jsf并不是添加该标记的有效理由。这就是为什么我提到java(您也在使用它,但该标记更无效)、energy(您正在使用它吗?)。用一个简单的jsp来实现它会失败吗?请阅读标签1。我希望有一种方法可以通过编程重新生成LTPA令牌,而无需用户重新登录。而且,使用其他业务应用程序延长集群上的超时时间会很麻烦。2.我宁愿不去
Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.