Kotlin 配置
本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。 |
Spring Security Kotlin 配置从 Spring Security 5.3 开始提供。它让用户通过使用原生 Kotlin DSL 来配置 Spring Security。
Spring Security提供了 一个示例应用程序 来演示Spring Security Kotlin配置的使用。 |
HttpSecurity
Spring Security如何知道我们想要求所有用户都要进行身份验证?Spring Security如何知道我们要支持基于表单的认证?有一个配置类(称为 SecurityFilterChain
)正在幕后被调用。它被配置为以下的默认实现。
import org.springframework.security.config.annotation.web.invoke
@Bean
open fun filterChain(http: HttpSecurity): SecurityFilterChain {
http {
authorizeRequests {
authorize(anyRequest, authenticated)
}
formLogin { }
httpBasic { }
}
return http.build()
}
确保在类中导入 invoke 函数,有时IDE不会自动导入该函数,从而导致编译问题。
|
默认配置(如上所示):
-
确保对我们的应用程序的任何请求都需要用户进行认证
-
让用户通过基于表单的登录进行认证
-
让用户用HTTP基本认证(HTTP Basic authentication)进行认证
请注意,这种配置与XML命名空间的配置是平行的。
<http>
<intercept-url pattern="/**" access="authenticated"/>
<form-login />
<http-basic />
</http>
多个 HttpSecurity 实例
我们可以配置多个 HttpSecurity
实例,就像我们可以有多个 <http>
块一样。关键是要注册多个 SecurityFilterChain
@Bean
。下面的例子对以 /api/
开头的URL有不同的配置。
@Configuration
import org.springframework.security.config.annotation.web.invoke
@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
}
@Order(1) (2)
@Bean
open fun apiFilterChain(http: HttpSecurity): SecurityFilterChain {
http {
securityMatcher("/api/**") (3)
authorizeRequests {
authorize(anyRequest, hasRole("ADMIN"))
}
httpBasic { }
}
return http.build()
}
@Bean (4)
open fun formLoginFilterChain(http: HttpSecurity): SecurityFilterChain {
http {
authorizeRequests {
authorize(anyRequest, authenticated)
}
formLogin { }
}
return http.build()
}
}
1 | 像往常一样配置认证。 |
2 | 创建一个 SecurityFilterChain 的实例,其中包含 @Order 以指定哪一个 SecurityFilterChain 应该被优先考虑。 |
3 | http.antMatcher 指出,这个 HttpSecurity 只适用于以 /api/ 开头的URL。 |
4 | 创建另一个 SecurityFilterChain 的实例。如果URL不是以 /api/ 开头,就会使用这个配置。这个配置被认为在 apiFilterChain 之后,因为它的 @Order 值在 1 之后(没有 @Order 默认为最后)。 |