重定向到登录isFullyAuthenticated()URL,然后再返回

时间:2013-03-23 22:12:04

标签: spring authentication login spring-security

我正在使用Spring Security 3.1.x并尝试实现以下方案:

  • 使用isFullyAuthenticated()
  • 保护页面
  • 当前用户仅通过“记住我”进行身份验证,因此未完全通过身份验证
  • 用户导航到此经过完全验证的页面 - 这应该不允许(并且不是)
  • 但是,用户不应该获得403页面 - 而是应该提示用户通过登录表单登录
  • 登录后,应允许用户前往他之前请求的页面,因为现在他是完全认证的用户

我的Spring Security配置是:

<http use-expressions="true">
    <intercept-url pattern="/admin/full_auth_only.html" access="isFullyAuthenticated()" />

    <form-login login-page="/login.html" default-target-url="/authenticated.html" />
    <logout />
    <remember-me key="someAppKey" />

</http>

我尝试添加:

        <access-denied-handler error-page="/login.html" />

然而,现在的问题是,在访问页面时,我的确是由登录表单提示,只有URL与登录不对应;相反,它是完全认证页面的URL:

http://localhost:8080/spring-security/admin/full_auth_only.html

然后中断了身份验证过程,该过程在尝试访问(无效)URL时失败: http://localhost:8080/spring-security/admin/j_spring_security_check
这应该是:
http://localhost:8080/spring-security/j_spring_security_check

对此有任何帮助 - 我认为用例非常常见,所以我更喜欢使用命名空间支持而不是自定义方向。

感谢。
尤金。

3 个答案:

答案 0 :(得分:0)

我无法使用Spring Security的版本3.1.3.RELEASE重现您的问题。你使用的是哪个版本?

AbstractAuthenticationProcessingFilter拦截身份验证请求,检查请求的URL是否以预先配置的值(默认为/j_spring_security_check)结束。具有该结尾​​的任何URL都将触发身份验证尝试。您可以看到相关代码here

这意味着您说的URL无效,实际上应该没有问题处理。

上面链接的代码自早期版本(2.x)以来没有更改过,因此在您的情况下应该存在其他一些问题。

如果您可以共享您的配置和一些调试级别日志,那将有助于揭示真正的问题。

答案 1 :(得分:0)

1.如果您有welcome-file-list,请删除任何web.xml

2.确保always-use-default-target标记中false 未设置为 form-login或将其全部删除。

3.确保您已允许每个人访问您的登录页面。像这样<intercept-url pattern="/login.htm" access="permitAll()"/>

这应该有效。

答案 2 :(得分:0)

听起来好像没有设置cookie,并且以下所有发送的请求都被视为没有会话ID的第一个请求,因此即使您已登录,spring security也会要求每次登录。

如果您使用的是Google chrome,并且使用本地主机地址在本地计算机上测试了该应用程序,则可能未设置Cookie。这是Google chrome的已知问题。

您可以尝试使用127.0.0.1进行测试。或尝试使用其他Web浏览器,例如Internet Explorer。