我在Tomcat 7上部署了一个基于Spring的Web应用程序。我要做的是将application.war
存档复制到webapps目录并启动服务器,因此我的应用程序根目录在{{1}下可用}。
然后我想添加Spring安全性(3.2.4)。我的目的是保护整个应用程序,而不仅仅是部分应用程序。我有Spring安全配置:
https://localhost:8443/application/
在<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
:
web.xml
这是一个基本配置,可以在官方文档和许多教程中找到。一切正常,当我没有经过身份验证时Spring会将我重定向到它的默认登录页面。然后我可以登录并可以访问应用程序,直到会话到期或我导航到注销URL。
当我访问没有尾部斜杠的应用程序根目录时,问题就开始出现了:<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
。
Spring无法找到安全上下文:
https://localhost:8443/application
然后我被重定向到登录页面,但是在我登录后,我被重定向到没有斜杠的原始URL,Spring再次失败,我再次看到登录表单。
有人知道为什么会这样吗?我的配置很少,使用开箱即用的默认值。用例也非常简单,但这并不像预期的那样令人感到奇怪。我觉得我缺少一些基本的东西,无论是使用Spring还是Tomcat。
任何帮助将不胜感激,谢谢。
答案 0 :(得分:1)
问题在于JSESSIONID cookie路径 - Tomcat将其自动设置为/application/
,因此任何访问应用程序root而没有斜杠的请求都被视为需要身份验证的新用户。将Cookie路径设置为/application
可以解决我的问题。
答案 1 :(得分:0)
试试这个
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
答案 2 :(得分:0)
<http auto-config="true">
<!-- my be this can`t match -->
<intercept-url pattern="/**" access="ROLE_USER" />
<!-- add this for try -->
<intercept-url pattern="/" access="ROLE_USER" />
</http>