我知道以前有人问过这个问题,但是我在这里遇到了一个特殊问题。
我使用弹簧安全 3.1.3。
我的 Web 应用程序中有 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 错误。
编辑:
感谢 Ralph,我能够找到解决方案。所以事情是这样的:我使用了这个属性
<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>
这里的解决方案很明显:登录页面只允许匿名用户使用。连接用户后,错误处理程序会将他重定向到主页。
我做了一些测试,一切似乎都运行良好。