最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

Kotlin の設定

Spring Security Kotlin 構成は、Spring Security 5.3 から利用可能になりました。これにより、ユーザーはネイティブ Kotlin DSL を使用して Spring Security を構成できるようになります。

Spring Security は、Spring Security Kotlin 構成の使用箇所を示すためにサンプルアプリケーション [GitHub] (英語) を提供します。

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()
}
IDE が常にメソッドを自動インポートするとは限らず、コンパイルの問題が発生するため、必ずクラスに invoke 関数をインポートしてください。

デフォルト構成(前のリストに示されています):

  • アプリケーションへのリクエストでは、ユーザーの認証が必要であることを保証します

  • ユーザーがフォームベースのログインで認証できるようにします

  • ユーザーが HTTP 基本認証で認証できるようにします

この構成は XML 名前空間の構成と類似していることに注意してください。

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

複数の HttpSecurity インスタンス

複数の <http> ブロックがあるのと同じように、複数の HttpSecurity インスタンスを構成できます。重要なのは、複数の 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@Order を含む SecurityFilterChain のインスタンスを作成して、どの SecurityFilterChain を最初に考慮するかを指定します。
3http.securityMatcher は、この HttpSecurity は /api/ で始まる URL にのみ適用可能であると述べています
4SecurityFilterChain の別のインスタンスを作成します。URL が /api/ で始まらない場合は、この構成が使用されます。この構成は、1 の後に @Order 値があるため、apiFilterChain の後に考慮されます(@Order のデフォルトは持続しません)。