gpt4 book ai didi

jsf spring安全 session 超时viewExpiredException

转载 作者:行者123 更新时间:2023-12-04 05:57:08 25 4
gpt4 key购买 nike

我在使用 JSF 的 Spring Security 中的超时存在以下问题:

我已经自定义了 session 管理过滤器,以便只要请求的页面是安全的(即,如果它只允许经过身份验证的用户),用户就会被重定向到 invalidSessionUrl。我放入 Spring Security 提供的 session 管理过滤器的自定义代码是:

if (invalidSessionUrl != null) {
String pagSolicitada = UtilSpringSecurity.extraerPagina(request);
if ( UtilSpringSecurity.paginaAutenticada(pagSolicitada ) ) {
request.getSession();
redirectStrategy.sendRedirect(request, response, invalidSessionUrl);
return;
}
//the requested page doesn't require the user to be authenticated
//so i just skip this filter and continue with the filter chain
chain.doFilter(request, response);
return;
}

方法“UtilSpringSecurity.extraerPagina(request)”以这种方式返回请求的页面:
public static String extraerPagina (HttpServletRequest request) {
String uri = request.getRequestURI().toLowerCase();
String cPath = request.getContextPath().toLowerCase();
// uri = cPath + pagina
int longCPath = cPath.length();
String pagina = uri.substring(longCPath);
return pagina;
}

如果参数是需要对用户进行身份验证的页面,则方法“UtilSpringSecurity.paginaAutenticada(pagSolicitada)”返回true(我使用IF进行检查,考虑到我的xml安全配置文件的intercept-url元素具有属性 access="isAuthenticated()" ):
public static boolean paginaAutenticada (String pagina) {

if (pagina.startsWith("/faces/paginas/administracion/") || pagina.startsWith("/faces/paginas/barco/") ) {
return true;
}
return false;
}

这个解决方案有效,但它只有一个问题:

如果我让浏览器在一个页面上保持空闲直到 session 超时到期,然后我请求同一页面,那么我会得到一个“viewExpiredException”。这是因为过滤器运行良好,它绕过了对 invalidSessionUrl 的重定向,但是由于 session 无论如何都过期了,然后我得到了该异常,试图重新呈现同一页面。

如果我在 session 超时到期时请求任何其他不安全的页面,它运行良好,它会正确重定向到页面并且我没有收到 viewExpiredException。

任何人都知道如何解决这个问题?

先感谢您。

最佳答案

Spring security 应该让您匿名访问未经身份验证的用户的页面集。下面是我的 XML 配置的摘录,说明了我是如何实现这一点的。

<http auto-config="true" access-denied-page="/unauthorized.xhtml" >
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
<intercept-url pattern="/app/**" access="ROLE_USER,ROLE_ADMIN" />
<intercept-url pattern="/*.xhtml" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<form-login login-page="/login.xhtml" login-processing-url="/j_spring_security_check"
authentication-success-handler-ref="authenticationSuccessBean"
authentication-failure-handler-ref="authenticationFailureBean" />
<session-management invalid-session-url="/login.xhtml" >
</session-management>
</http>

我基本上使用 intercept-url标签声称某些相对上下文中的页面只能由以下角色访问。您可以看到 Web 应用程序默认上下文中的所有页面都可供匿名用户使用。如果用户未经授权查看该页面,则他们将被重定向到 access-denied-page .

唯一的问题是您的 User bean 必须实现 UserDetails接口(interface)并有一个属性,该属性返回实现 GrantedAuthority 的角色 bean界面。 Spring 将寻找 UserDetails有一个 GrantedAuthority属性来确定角色是什么。如果此用户不存在、未经身份验证或未知,则默认为匿名角色。

关于jsf spring安全 session 超时viewExpiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com