# Kotlin 配置
Spring 安全性提供了示例应用程序 (opens new window),这演示了 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 的另一个实例。如果 URL 不以 /api/ 开始,将使用此配置。此配置在 ApiWebSecurityConfigurationAdapter 之后被考虑,因为它在1 之后有一个@Order 值(没有@Order 默认为最后)。 |