在讨论访问控制时,我们已经简单地看过`FilterSecurityInterceptor`,我们已经将它与命名空间一起使用,其中`<intercept-url>`元素被组合在内部进行配置。 现在我们将看到如何显式配置它以与`FilterChainProxy`一起使用,以及它的伴随过滤器`ExceptionTranslationFilter`。 典型配置示例如下所示:
~~~
<bean id="filterSecurityInterceptor"
class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="securityMetadataSource">
<security:filter-security-metadata-source>
<security:intercept-url pattern="/secure/super/**" access="ROLE_WE_DONT_HAVE"/>
<security:intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR,ROLE_TELLER"/>
</security:filter-security-metadata-source>
</property>
</bean>
~~~
`FilterSecurityInterceptor`负责处理HTTP资源的安全性。它需要引用`AuthenticationManager`和`AccessDecisionManager`。它还提供了适用于不同HTTP URL请求的配置属性。请参阅技术介绍中有关这些内容的原始讨论。
`FilterSecurityInterceptor`可以通过两种方式配置配置属性。第一个(如上所示)使用`<filter-security-metadata-source>`命名空间元素。这类似于命名空间章节中的`<http>`元素,但`<intercept-url>`子元素仅使用`pattern` 和 `access`属性。逗号用于分隔适用于每个HTTP URL的不同配置属性。第二个选项是编写自己的`SecurityMetadataSource`,但这超出了本文档的范围。无论使用何种方法,`SecurityMetadataSource`都负责返回包含与单个安全HTTP URL关联的所有配置属性的`List <ConfigAttribute>`。
应该注意的是,`FilterSecurityInterceptor.setSecurityMetadataSource()`方法实际上需要`FilterInvocationSecurityMetadataSource`的实例。这是一个标记接口,它是`SecurityMetadataSource`的子类。它只是表示`SecurityMetadataSource`了解`FilterInvocation`。为了简单起见,我们将继续将`FilterInvocationSecurityMetadataSource`称为`SecurityMetadataSource`,因为区别与大多数用户没有多大关系。
由命名空间语法创建的`SecurityMetadataSource`通过将请求URL与配置的 `pattern`属性相匹配来获取特定`FilterInvocation`的配置属性。这与命名空间配置的行为方式相同。缺省情况是将所有表达式视为Apache Ant路径,并且对于更复杂的情况也支持正则表达式。` request-matcher`属性用于指定正在使用的模式的类型。无法在同一定义中混合表达式语法。例如,使用正则表达式而不是Ant路径的先前配置将编写如下:
~~~
<bean id="filterInvocationInterceptor"
class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="runAsManager" ref="runAsManager"/>
<property name="securityMetadataSource">
<security:filter-security-metadata-source request-matcher="regex">
<security:intercept-url pattern="\A/secure/super/.*\Z" access="ROLE_WE_DONT_HAVE"/>
<security:intercept-url pattern="\A/secure/.*\" access="ROLE_SUPERVISOR,ROLE_TELLER"/>
</security:filter-security-metadata-source>
</property>
</bean>
~~~
始终按照定义的顺序评估模式。 因此,重要的是在列表中定义的更具体的模式比不太具体的模式更高。 这反映在上面的示例中,其中更具体 `/secure/super/`模式看起来高于不太具体 `/secure/`。 如果它们被反转,则`/ secure /` pattern将始终匹配,并且永远不会使用`/ secure / super /` pattern。
- 架构
- 9.技术概述
- 9.1 运行环境
- 9.2 核心组件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 总结
- 9.3 验证
- 9.3.1 在Spring Security中验证是什么
- 9.3.2 直接设置SecurityContextHolder内容
- 9.4 web应用中的验证
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 验证机制
- 9.4.4 在请求之间存储SecurityContext
- 9.5 Spring Security中的访问控制(授权)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置属性
- RunAsManager
- AfterInvocationManager
- 扩展安全对象模型
- 9.6 本地化
- 10 核心服务
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功验证时擦除凭据
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService实现
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密码发展史
- 10.3.2 DelegatingPasswordEncoder
- 密码存储格式
- 密码编码
- 密码比对
- 入门体验
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 测试方法安全
- 12 集成spring mvc测试
- 13 webflux支持
- 14 安全过滤器链
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 绕过过滤链
- 14.3 过滤器顺序
- 14.4 匹配请求和http防火墙
- 14.5 与其他基于过滤器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全过滤器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter