# Kotlin 配置

|   |Spring 安全性提供了[示例应用程序](https://github.com/spring-projects/spring-security-samples/tree/main/servlet/spring-boot/kotlin/hello-security)，这演示了 Spring 安全性 Kotlin 配置的使用。|
|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

## HttpSecurity

Spring 安全性如何知道我们希望要求对所有用户进行身份验证？ Spring 安全性如何知道我们希望支持基于表单的身份验证？有一个正在幕后调用的配置类，名为`WebSecurityConfigurerAdapter`。它有一个名为`configure`的方法，其默认实现如下：

```
fun configure(http: HttpSecurity) {
   http {
        authorizeRequests {
            authorize(anyRequest, authenticated)
        }
       formLogin { }
       httpBasic { }
    }
}
```

上面的默认配置：

* 确保对我们的应用程序的任何请求都需要对用户进行身份验证。

* 允许用户通过基于表单的登录进行身份验证

* 允许用户使用 HTTP Basic 身份验证进行身份验证

你将注意到此配置与 XML 名称空间配置非常相似：

```
<http>
	<intercept-url pattern="/**" access="authenticated"/>
	<form-login />
	<http-basic />
</http>
```

## 多重 HttpSecurity

我们可以配置多个 HttpSecurity 实例，就像我们可以配置多个`<http>`块一样。关键是将`WebSecurityConfigurerAdapter`多次扩展。例如，下面是一个以`/api/`开头的不同 URL 配置的示例。

```
@EnableWebSecurity
class MultiHttpSecurityConfig {
    @Bean                                                            (1)
    public fun userDetailsService(): UserDetailsService {
        val users: User.UserBuilder = User.withDefaultPasswordEncoder()
        val manager = InMemoryUserDetailsManager()
        manager.createUser(users.username("user").password("password").roles("USER").build())
        manager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build())
        return manager
    }

    @Configuration
    @Order(1)                                                        (2)
    class ApiWebSecurityConfigurationAdapter: WebSecurityConfigurerAdapter() {
        override fun configure(http: HttpSecurity) {
            http {
                securityMatcher("/api/**")                           (3)
                authorizeRequests {
                    authorize(anyRequest, hasRole("ADMIN"))
                }
                httpBasic { }
            }
        }
    }

    @Configuration                                                   (4)
    class FormLoginWebSecurityConfigurerAdapter: WebSecurityConfigurerAdapter() {
        override fun configure(http: HttpSecurity) {
            http {
                authorizeRequests {
                    authorize(anyRequest, authenticated)
                }
                formLogin { }
            }
        }
    }
}
```

|**1**|将身份验证配置为常规身份验证|
|-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|**2**|创建一个包含`@Order`的`WebSecurityConfigurerAdapter`实例，以指定应该首先考虑哪个`WebSecurityConfigurerAdapter`。|
|**3**|`http.antMatcher`声明此`HttpSecurity`将仅适用于以`/api/`开头的 URL|
|**4**|创建`WebSecurityConfigurerAdapter`的另一个实例。<br/>如果 URL 不以`/api/`开始，将使用此配置。<br/>此配置在`ApiWebSecurityConfigurationAdapter`之后被考虑，因为它在`1`之后有一个`@Order`值（没有`@Order`默认为最后）。|

[Java 配置](java.html)[名称空间配置](xml-namespace.html)

