Kotlin 配置

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 {
        authorizeHttpRequests {
            authorize(anyRequest, authenticated)
        }
        formLogin { }
        httpBasic { }
    }
    return http.build()
}
确保导入 org.springframework.security.config.annotation.web.invoke 函数以在你的类中启用 Kotlin DSL,因为 IDE 不会始终自动导入该方法,从而导致编译问题。

默认配置(如前一列表中所示)

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

  • 允许用户使用基于表单的登录进行身份验证

  • 允许用户使用 HTTP 基本身份验证进行身份验证

请注意,此配置与 XML 命名空间配置相平行

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

多个 HttpSecurity 实例

我们可以配置多个 HttpSecurity 实例,就像我们可以拥有多个 <http> 块一样。关键是注册多个 SecurityFilterChain @Bean。以下示例对以 /api/ 开头的 URL 具有不同的配置

import org.springframework.security.config.annotation.web.invoke

@Configuration
@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)
            authorizeHttpRequests {
                authorize(anyRequest, hasRole("ADMIN"))
            }
            httpBasic { }
        }
        return http.build()
    }

    @Bean                                                            (4)
    open fun formLoginFilterChain(http: HttpSecurity): SecurityFilterChain {
        http {
            authorizeHttpRequests {
                authorize(anyRequest, authenticated)
            }
            formLogin { }
        }
        return http.build()
    }
}
1 像往常一样配置身份验证。
2 创建 SecurityFilterChain 的实例,其中包含 @Order 以指定哪个 SecurityFilterChain 应该首先被考虑。
3 http.securityMatcher 指示此 HttpSecurity 仅适用于以 /api/ 开头的 URL
4 创建 SecurityFilterChain 的另一个实例。如果 URL 不以 /api/ 开头,则使用此配置。此配置在 apiFilterChain 之后被考虑,因为它具有 1 之后的 @Order 值(没有 @Order 默认情况下为最后一个)。