jsf spring安全 session 超时viewExpiredException

标签 jsf redirect spring-security timeout viewexpiredexception

我在使用 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 安全配置文件的拦截 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 安全性应该为未经身份验证的用户提供对页面集的匿名访问。下面是我的 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 接口(interface)的角色 bean 的属性。 Spring 将查找具有 GrantedAuthority 属性的 UserDetails 来确定角色是什么。如果该用户不存在、未经身份验证或未知,则它将默认为匿名角色。

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

相关文章:

reactjs - 状态重定向在 React Router 4.x 中不起作用

spring - 在 Spring 3 Controller 中返回字符串时为重定向设置 HTTP 状态代码

java - wicket-auth-roles 和 spring-security-cas-client 之间的身份验证集成问题

java - 如何在登录时显示带有欢迎消息的通知?

jsf - 关于在 JSF 中上传文件的基本问题

c# - 如何使用 MVC3 中的 SAML 断言发布到另一个网站?

spring - BadCredentialsException : Kerberos validation not succesfull

java - Spring Security CORS 问题 : "OPTIONS http://localhost:8080/403 ()"

javascript - widgetVar 在 p :repeat for printing Charts 中无法正常工作

java - 为什么屏幕上显示的是异常而不是错误页面?