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默认为最后)。 |