最近Spring Security已经给了机会配置几个<http>
元素。我正在尝试为映射模式/ foo / *的所有URL设置配置,为其余映射设置另一个配置。现在我有两个登录页面,一个在/ login中设置,另一个在/ foo登录中。所以我希望映射/ foo / **的所有URL都针对/ foo / login进行登录。
我创建了一个类似下面的配置,但是当我输入一个像/ foo / something(不应该允许匿名用户)的URL而不是去/ foo / login时,它会转到/ login。
Spring Security版本 3.1.0.RC1 。 知道可能发生的事情吗?
感谢。
<sec:http auto-config="true" pattern="/foo/**" entry-point-ref="ajaxAuthenticationEntryPoint">
<sec:intercept-url pattern="/foo/login" access="ROLE_ANONYMOUS,ROLE_BASIC,ROLE_ADMIN" />
...
<!-- other sec:intercepts for some /foo/* urls -->
...
<sec:intercept-url pattern="/foo/**" access="ROLE_BASIC" />
<sec:custom-filter before="SECURITY_CONTEXT_FILTER" ref="basicProcessingFilter" />
<sec:form-login login-page="/foo/login" authentication-failure-url="/foo/login" default-target-url="/index" always-use-default-target="true" />
<sec:session-management>
<sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login" />
</sec:session-management>
</sec:http>
<sec:http auto-config="true" pattern="/**" entry-point-ref="ajaxAuthenticationEntryPoint">
<!-- some sec:intercepts for some urls -->
...
<sec:intercept-url pattern="/**" access="ROLE_ADMIN" />
<sec:custom-filter before="SECURITY_CONTEXT_FILTER" ref="basicProcessingFilter" />
<sec:form-login login-page="/login" default-target-url="/index" always-use-default-target="true" />
<sec:session-management>
<sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login" />
</sec:session-management>
</sec:http>
答案 0 :(得分:1)
只是一个猜测。可能是模式是添加剂吗?
所以注释如下:
<sec:http auto-config="true" pattern="/foo/**" entry-point-ref="ajaxAuthenticationEntryPoint">
<sec:intercept-url pattern="/foo/**" access="ROLE_BASIC" />
</sec:http>
拦截/foo/foo/**
。这将导致foo/something
请求被您的第二个http定义拦截,pattern="/**"
答案 1 :(得分:1)
AuthenticationEntryPoint
负责重定向到登录页面。您已注入自定义入口点,该入口点将覆盖login-page
元素上的form-login
属性。
ajaxAuthenticationEntryPoint
重定向到/login
吗?
理想情况下,Spring Security应检测您是否尝试使用自定义入口点和login-page
并报告警告。
答案 2 :(得分:0)
使用http元素中的pattern属性会导致Spring Security 3.1在读取其余内部元素之前将该模式应用于URL,因此如果它不匹配则会忽略所有内部元素并继续下一个http元素。
/ foo / login的登录页面中的某些内容是否引用了/ **模式所涵盖的资源?