# 使用 FilterSecurityInterceptor 授权 HttpServletRequest | |`FilterSecurityInterceptor`正在被[`AuthorizationFilter`]替换。
考虑使用它。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------| 本节通过深入研究[授权](index.html#servlet-authorization)在基于 Servlet 的应用程序中的工作方式,构建了[Servlet Architecture and Implementation](../architecture.html#servlet-architecture)。 [`FilterSecurityInterceptor`](https://DOCS. Spring.io/ Spring-security/site/DOCS/5.6.2/api/org/springframework/security/web/access/intercept/filtersecurityinterceptor.html)为`HttpServletRequest`s 提供[授权](index.html#servlet-authorization)。它作为[安全过滤器](../architecture.html#servlet-security-filters)中的一个插入到[FilterchainProxy](../architecture.html#servlet-filterchainproxy)中。 ![过滤安全拦截器](https://docs.spring.io/spring-security/reference/_images/servlet/authorization/filtersecurityinterceptor.png) 图 1。授权 HttpServletRequest * ![number 1](https://docs.spring.io/spring-security/reference/_images/icons/number_1.png)首先,`FilterSecurityInterceptor`从[SecurityContextholder](../authentication/architecture.html#servlet-authentication-securitycontextholder)得到一个[认证](../authentication/architecture.html#servlet-authentication-authentication)。 * ![number 2](https://docs.spring.io/spring-security/reference/_images/icons/number_2.png)第二,`FilterSecurityInterceptor`从`HttpServletRequest`、`HttpServletResponse`和`FilterChain`中创建一个[`FilterChain`(https://DOCS. Spring.io/ Spring-security/site/site/DOCS/5.6.2/api/org/springframework/security/web/filterinvocation.html),并传递到`HttpServletRequest`中的`HttpServletResponse`和`FilterChain`中。 * ![number 3](https://docs.spring.io/spring-security/reference/_images/icons/number_3.png)下一步,它将`FilterInvocation`传递到`SecurityMetadataSource`,得到`ConfigAttribute`s。 * ![number 4](https://docs.spring.io/spring-security/reference/_images/icons/number_4.png)最后,它将`Authentication`、`FilterInvocation`和`ConfigAttribute`s 传递给 Xref: Servlet/授权。ADOC#authz-access-decision-manager`AccessDecisionManager`。 * ![number 5](https://docs.spring.io/spring-security/reference/_images/icons/number_5.png)如果拒绝授权,将抛出`AccessDeniedException`。在这种情况下,[`ExceptionTranslationFilter`](../architecture.html# Servlet-ExceptionTranslationFilter)处理`AccessDeniedException`。 * ![number 6](https://docs.spring.io/spring-security/reference/_images/icons/number_6.png)如果访问被授予,`FilterSecurityInterceptor`继续使用[滤清链](../architecture.html#servlet-filters-review),这允许应用程序正常处理。 默认情况下, Spring Security 的授权将要求对所有请求进行身份验证。显式配置如下所示: 例 1。每个请求都必须经过验证。 爪哇 ``` protected void configure(HttpSecurity http) throws Exception { http // ... .authorizeRequests(authorize -> authorize .anyRequest().authenticated() ); } ``` XML ``` ``` Kotlin ``` fun configure(http: HttpSecurity) { http { // ... authorizeRequests { authorize(anyRequest, authenticated) } } } ``` 我们可以通过按优先级顺序添加更多规则来配置 Spring 安全性,使其具有不同的规则。 例 2。授权请求 爪哇 ``` protected void configure(HttpSecurity http) throws Exception { http // ... .authorizeRequests(authorize -> authorize (1) .mvcMatchers("/resources/**", "/signup", "/about").permitAll() (2) .mvcMatchers("/admin/**").hasRole("ADMIN") (3) .mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") (4) .anyRequest().denyAll() (5) ); } ``` XML ``` (1) (2) (3) (4) (5) ``` Kotlin ``` fun configure(http: HttpSecurity) { http { authorizeRequests { (1) authorize("/resources/**", permitAll) (2) authorize("/signup", permitAll) authorize("/about", permitAll) authorize("/admin/**", hasRole("ADMIN")) (3) authorize("/db/**", "hasRole('ADMIN') and hasRole('DBA')") (4) authorize(anyRequest, denyAll) (5) } } } ``` |**1**|指定了多个授权规则。
每个规则都按照它们被声明的顺序被考虑。| |-----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |**2**|我们指定了任何用户都可以访问的多个 URL 模式。
具体来说,如果 URL 以“/resources/”开头,等于“/signup”或等于“/about”,则任何用户都可以访问请求。| |**3**|任何以“/admin/”开头的 URL 都将被限制为具有角色“role\_admin”的用户。
你将注意到,由于我们正在调用`hasRole`方法,因此我们不需要指定“role\_”前缀。| |**4**|任何以“/db/”开头的 URL 都要求用户同时具有“role\_admin”和“role\_DBA”。
你将注意到,由于我们使用的是`hasRole`表达式,因此我们不需要指定“role\_”前缀。| |**5**|任何尚未匹配的 URL 都将被拒绝访问。
如果你不想意外地忘记更新授权规则,这是一个很好的策略。| [授权 HTTP 请求](authorize-http-requests.html)[基于表达式的访问控制](expression-based.html)