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