0

我正在使用 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

对此的任何帮助表示赞赏 - 我认为用例非常常见,因此我更喜欢使用命名空间支持而不是自定义方向。

谢谢。
欧根。

4

3 回答 3

0

1.删​​除任何welcome-file-list如果你有web.xml

2.确保always-use-default-target设置为 falseinform-login标签或将其全部删除。

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

那应该行得通。

于 2013-04-05T05:27:07.273 回答
0

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

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

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

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

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

于 2013-03-24T14:17:13.320 回答
0

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

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

您可以尝试 127.0.0.1 来测试。或者尝试其他网络浏览器,例如 Internet Explorer。

于 2020-03-04T01:06:52.027 回答