# 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 创建一个包含@OrderWebSecurityConfigurerAdapter实例,以指定应该首先考虑哪个WebSecurityConfigurerAdapter
3 http.antMatcher声明此HttpSecurity将仅适用于以/api/开头的 URL
4 创建WebSecurityConfigurerAdapter的另一个实例。
如果 URL 不以/api/开始,将使用此配置。
此配置在ApiWebSecurityConfigurationAdapter之后被考虑,因为它在1之后有一个@Order值(没有@Order默认为最后)。

Java 配置名称空间配置