当前位置: 首页 > 知识库问答 >
问题:

成功登录后Spring Security重定向到上一页

韦欣德
2023-03-14

我知道这个问题以前有人问过,但我现在面临一个特殊的问题。

我使用spring security 3.1.3。

我的web应用程序中有3种可能的登录情况:

  1. 通过登录页登录:确定。
  2. 通过受限页面登录:也可以。
  3. 通过非受限页面登录:不确定...每个人都可以访问“产品”页面,如果用户已经登录,他可以发表评论。因此登录表单包含在同一页面中,以便允许用户进行连接。

案例3)的问题是,我无法将用户重定向到“产品”页面。他们在成功登录后会被重定向到主页,无论如何。

请注意,在情况2)中,成功登录后,重定向到受限制页面的工作是开箱即用的。

下面是我的security.xml文件的相关部分:

<!-- Authentication policy for the restricted page  -->
<http use-expressions="true" auto-config="true" pattern="/restrictedPage/**">
    <form-login login-page="/login/restrictedLogin" authentication-failure-handler-ref="authenticationFailureHandler" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
    <form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
    <logout logout-url="/logout" logout-success-url="/" />
</http>

我怀疑“每个页面的身份验证策略”应该为这个问题负责。但是,如果我移除它,我就不能再登录了...j_spring_security_check发送404错误。

编辑:

多亏了拉尔夫,我才找到了解决办法。事情是这样的:我用了

<property name="useReferer" value="true"/>

拉尔夫给我看的。在此之后,我遇到了一个问题1):当通过登录页面登录时,用户停留在同一页面中(而不是像以前一样重定向到主页)。直到这个阶段的代码如下:

<!-- Authentication policy for login page -->
<http use-expressions="true" auto-config="true" pattern="/login/**">
    <form-login login-page="/login" authentication-success-handler-ref="authenticationSuccessHandlerWithoutReferer" />
</http>

<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
    <form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
    <logout logout-url="/logout" logout-success-url="/" authentication-success-handler-ref="authenticationSuccessHandler"/>
</http>

<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <!-- After login, return to the last visited page -->
    <beans:property name="useReferer" value="true" />
</beans:bean>

<beans:bean id="authenticationSuccessHandlerWithoutReferer" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <!-- After login, stay to the same page -->
    <beans:property name="useReferer" value="false" />
</beans:bean>

至少在理论上,这应该行得通,但事实并非如此。我还是不知道为什么,所以如果有人对此有答案,我会很乐意创造一个新的话题给他分享他的解决方案。

在此期间,我找到了一个变通办法。不是最好的解决办法,但就像我说的,如果有人有更好的东西要展示,我洗耳恭听。这是登录页面的新身份验证策略:

<http use-expressions="true" auto-config="true" pattern="/login/**" >
    <intercept-url pattern="/**" access="isAnonymous()" />
    <access-denied-handler error-page="/"/>
</http>

这里的解决方案很明显:登录页面只允许匿名用户使用。一旦连接了用户,错误处理程序就会将其重定向到主页。

我做了一些测试,看起来一切正常。

共有1个答案

潘志国
2023-03-14

登录(用户被重定向到哪个url)后发生的事情由authenticationSuccessHandler处理。

此接口(实现它的具体类是SavedRequestawareAuthenticationSuccessShandler)由AbstractAuthenticationProcessingFilter或方法SuccessAuthentication中的一个子类(如UsernamePasswordAuthenticationFilter)调用。

因此,在情况3中,为了进行另一重定向,您必须对SavedRequestawareAuthenticationSuccessHandler进行子类化,并使其执行您想要的操作。

有时(取决于您的确切用途),启用AbstractureTenticationTargetUrlRequestHandlerUsereFerer标志就足够了,该标志由SimpleURLAuthenticationSuccessHandlerSavedRequestawareAuthenticationSuccessHandler的超级类)调用。

<bean id="authenticationFilter"
      class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="filterProcessesUrl" value="/login/j_spring_security_check" />
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="authenticationSuccessHandler">
        <bean class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
            <property name="useReferer" value="true"/>
        </bean>
    </property>
    <property name="authenticationFailureHandler">
        <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
            <property name="defaultFailureUrl" value="/login?login_error=t" />
        </bean>
    </property>
</bean>
 类似资料:
  • 问题内容: 我知道之前曾有人问过这个问题,但是我在这里面临一个特殊的问题。 我使用Spring Security 3.1.3。 我的Web应用程序中有3种可能的登录案例: 通过登录页面登录:确定。 通过受限页面登录:也可以。 通过非受限页面登录:不好,…每个人都可以访问“产品”页面,并且用户可以在登录后发表评论。因此,同一页面中包含一个登录表单,以允许用户进行连接。 情况3)的问题是我无法设法将用

  • 问题内容: 我正在尝试建立一个简单的网站,其登录功能与SO上的登录功能非常相似。用户应该能够以匿名用户的身份浏览网站,并且每个页面上都会有一个登录链接。当单击登录链接时,用户将被带到登录表单。成功登录后,应将用户带回到他首先单击登录链接的页面。我猜想我必须以某种方式将当前页面的url传递给处理登录表单的视图,但是我真的无法使其正常工作。 编辑:我想通了。我通过将当前页面作为GET参数传递来链接到登

  • 在Woocommerce for WordPress上,当您在产品页面上单击登录时,当您登录时,您将从您的帐户重定向到仪表板页面,而不是之前阅读的页面。 我正在尝试这样做,在登录前重定向到上一页,如果我的站点上没有上一页,则重定向到主页。 我已经试过了,但每次我都被重定向到主页。 有什么想法吗?

  • 问题内容: 我一直在寻找解决方案,但无论尝试如何,似乎都无法正确解决。 成功登录后,应该将用户重定向到他来自的页面,假设他一直在浏览帖子,并且想要登录以便可以发表评论,因此应该将他重定向到他正在浏览的帖子。所以这是我所拥有的: login.php 显示登录表单: 在 登录-check.php 检查用户名和传球被输入,的确用户存在,或者如果他已经登录,并且参数发送给login.php中: 然后将参数

  • 我正在处理一项要求,即在记录更新/插入后发送电子邮件,其中我将页面URL作为“单击此处”文本发送,当用户单击该链接时,无论用户是否登录,他都将被重定向到该页面。 现在,如果用户已经登录,则该页面将正常打开,但如果用户未登录,则需要在登录后重定向回上一页。 我的问题在这里是我无法重定向回上一页用户试图访问之前登录通过点击这里链接从电子邮件 我已经找到了一些解决方案,但它们都不起作用。我尝试过的解决方

  • 我在模态窗口中有登录表单。成功登录后,用户被重定向到< code>/页面。我正试图找到一种方法,在登录后留在联系页面或另一个页面。如何做到这一点?我的代码是: