我有一个带有配置文件的spring应用程序,如下所示。所有配置看起来都是正确的,但在调试时我发现,在初始化期间,为FilterSecurityInterceptor创建了两个没有任何拦截网址规则的bean,另一个用我指定的规则创建。 当请求到来时,它使用FilterSecurityInterceptor bean而没有intercept-url规则。所以我看到以下日志:
DEBUG FilterSecurityInterceptor:183 - Public object - authentication not attempted
但请求网址属于拦截网址规则。我调试并发现这是因为使用的bean在httpMethodMap
的{{1}}中没有任何拦截规则。
我不确定这里有什么问题。
以下是DefaultFilterInvocationSecurityMetadataSource
:
applicationContext-security.xml
在此感谢任何帮助。
答案 0 :(得分:7)
配置中有<security:http>
个元素。来自文档:
<强> 38.1.2 <http> 强>
每个<http>
命名空间块始终会创建SecurityContextPersistenceFilter
,ExceptionTranslationFilter
和FilterSecurityInterceptor
。这些是固定的,不能用替代品替代。
因此忽略了您的<bean id="filterSecurityInterceptor">
。而不是
<bean id="filterSecurityInterceptor"
class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="securityMetadataSource">
<security:filter-security-metadata-source>
<security:intercept-url pattern="/login.htm*"
access="ROLE_ANONYMOUS" />
<security:intercept-url pattern="/**"
access="ROLE_USER,ROLE_ADMIN" />
</security:filter-security-metadata-source>
</property>
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="authenticationManager" ref="authenticationManager" />
</bean>
您应该更改<security:http>
以包含类似
<security:http ...
authentication-manager-ref="authenticationManager">
...
<security:intercept-url pattern="/login.htm*"
access="ROLE_ANONYMOUS" />
<security:intercept-url pattern="/**"
access="ROLE_USER,ROLE_ADMIN" />
</security:http>
您不需要<bean id="accessDecisionManager">
,因为(docs)引用“默认情况下,AffirmativeBased
实施用于RoleVoter
和{{1 “,这正是你定义的。
此外,我们会忽略您的AuthenticatedVoter
,而应将<bean id="securityContextFilter">
属性添加到security-context-repository-ref="securityContextRepository"
元素。
并且您的http
被忽略,我不确定如何正确替换它。
您手动定义了很多<bean id="exceptionTranslator">
个bean。我怀疑它们中的大部分都是不必要的(默认定义),或者应该使用org.springframework.security
命名空间的专用元素来定义,而不是使用raw spring security:
。