我正在使用Spring Security 3.1.x并尝试实现以下方案:
我的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
对此有任何帮助 - 我认为用例非常常见,所以我更喜欢使用命名空间支持而不是自定义方向。
感谢。
尤金。
答案 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。