3

我对 spring 安全性的配置和我使用的 InvalidSessionStrategy 实现有一个小问题。

假设用户连接到应用程序并正在查看页面:/userArea/thePage并且他们的会话超时,用户将首先被重定向到页面/signin。然后,在成功登录后,他们将被重定向到他们个人区域( )的主页,而我希望他们在会话超时时回到他们所在的位置,即./userArea/userArea/thePage

这可能吗?

如果是这样,我需要如何更改我的配置/应用程序?

这是我当前的配置:

<beans:bean id="sessionManagementFilter" class="org.springframework.security.web.session.SessionManagementFilter">
        <beans:constructor-arg name="securityContextRepository" ref="httpSessionSecurityContextRepository" />
        <beans:property name="invalidSessionStrategy" ref="simpleRedirectInvalidSessionStrategy" />
    </beans:bean>

<beans:bean id="simpleRedirectInvalidSessionStrategy" class="org.springframework.security.web.session.SimpleRedirectInvalidSessionStrategy">
    <beans:constructor-arg name="invalidSessionUrl" value="/signin" />
    <beans:property name="createNewSession" value="true" />
</beans:bean>


<http auto-config="true" use-expressions="true">
        <custom-filter ref="sessionManagementFilter" before="SESSION_MANAGEMENT_FILTER" />
        <form-login login-processing-url="/resources/j_spring_security_check" login-page="/signin" authentication-failure-url="/signin?login_error=t" default-target-url="/userArea" />
        <logout logout-url="/resources/j_spring_security_logout" logout-success-url="/signin" />
...

编辑 1:让我更好地说明我的要求:

  • 当用户会话超时时,我希望将用户重定向到保存的请求(他们在重定向到登录页面之前请求的 url)。
  • 但是,当他们最初使用应用程序登录时,我希望他们被重定向到个人区域的主页。

我的要求是否可以使用 Carsten 建议的解决方案来实现(见下文)?

4

2 回答 2

1

您可以always-use-default-target="true"form-login标签中设置。这会将用户重定向到他们在被拦截登录之前尝试访问的 url。

但这将是标准行为,不仅在会话超时的情况下。根据应用程序,这可能不是您想要的。

编辑: 要做你想做的事,你需要找到一种方法来保存会话超时时用户在哪个页面上的信息。我不知道任何针对此问题的开箱即用解决方案,因为没有状态指示用户是否超时或手动注销。

需要做的是:

  1. 设置标志或在会话超时时保存页面 URL
  2. 签入自定义 AuthenticationSuccesHandler 并相应地重定向

如果我要实现类似的东西,我很可能会存储页面 URL。从用户体验的角度来看,这也有一些棘手的事情。如果保存的页面依赖于之前实现的状态会发生什么?(我认为这就是您希望用户在正常登录时转到默认 URL 的原因?)如果用户只是不注销会发生什么关闭睡眠并登录导航到登录页面(标志/page-url 超时?)?等等

一般来说,我认为最好使用 ,always-use-default-target="true"因为这增加了为任何页面添加书签的舒适度,而不必在每次登录时导航到那里。

于 2013-05-29T10:34:09.413 回答
0

看起来这是任何 Spring 项目的常见问题。

Spring 开发人员认为这是未记录的行为https://github.com/spring-projects/spring-security/issues/1981,我的业务用户认为这是一个错误。所以,因此,我们需要做一些自定义实现)))对我个人来说,这是一个错误,在进行自定义实现之后,我不明白为什么它没有在 Spring Framework 中修复。

与许多其他情况一样,我们别无选择,只能复制粘贴 SimpleRedirectInvalidSessionStrategy 并添加我们的自定义代码。

您甚至可以进一步简化此代码(我只是进行了自定义,可以在 Spring 中使用 OOTB):

public class CustomInvalidSessionStrategy implements InvalidSessionStrategy {

    private final Log logger = LogFactory.getLog(this.getClass());
    private String destinationUrl = null;
    private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
    private boolean createNewSession = true;

    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.logger.debug("Starting new session (if required) and redirecting to '" + this.destinationUrl + "'");
        if (this.createNewSession) {
            request.getSession();
        }

        if (destinationUrl == null) {
            this.redirectStrategy.sendRedirect(request, response, request.getRequestURI());
        } else {
            this.redirectStrategy.sendRedirect(request, response, this.destinationUrl);
        }
    }

    public void setCreateNewSession(final boolean createNewSession) {
        this.createNewSession = createNewSession;
    }

    public void setInvalidSessionUrl(final String invalidSessionUrl) {
        Assert.isTrue(UrlUtils.isValidRedirectUrl(invalidSessionUrl), "url must start with '/' or with 'http(s)'");
        this.destinationUrl = invalidSessionUrl;
    }
}

还有一些额外的 Spring 安全配置:

<security:http ...>
    ...
    <security:session-management invalid-session-strategy-ref="customInvalidSessionStrategy" />
    ...
</security:http>

<bean id="customInvalidSessionStrategy" class="com.custom.web.security.CustomInvalidSessionStrategy"/>
于 2021-11-19T13:13:14.147 回答