Spring Security
Spring Security がクラスパス上にある場合、Web アプリケーションはデフォルトで保護されます。Spring Boot は、Spring Security のコンテンツネゴシエーション戦略に基づいて、httpBasic
と formLogin
のどちらを使用するかを決定します。Web アプリケーションにメソッドレベルのセキュリティを追加するには、必要な設定で @EnableMethodSecurity
(Javadoc) を追加することもできます。詳細については、Spring Security リファレンスガイドを参照してください。
デフォルトの UserDetailsService
(Javadoc) には 1 人のユーザーがいます。ユーザー名は user
で、パスワードはランダムであり、次の例に示すように、アプリケーションの起動時に WARN レベルで出力されます。
Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
This generated password is for development use only. Your security configuration must be updated before running your application in production.
ロギング構成を微調整する場合は、org.springframework.boot.autoconfigure.security カテゴリが WARN -level メッセージを記録するように設定されていることを確認してください。それ以外の場合、デフォルトのパスワードは出力されません。 |
spring.security.user.name
および spring.security.user.password
を提供することにより、ユーザー名とパスワードを変更できます。
Web アプリケーションでデフォルトで取得する基本機能は次のとおりです。
メモリ内ストアと生成されたパスワードを持つ単一のユーザーを持つ
UserDetailsService
(Javadoc) (WebFlux アプリケーションの場合はReactiveUserDetailsService
(Javadoc) ) Bean (ユーザーのプロパティについてはSecurityProperties.User
(Javadoc) を参照)。アプリケーション全体(アクチュエーターがクラスパス上にある場合はアクチュエーターエンドポイントを含む)に対するフォームベースのログインまたは HTTP Basic セキュリティ(リクエストの
Accept
ヘッダーに依存)。認証イベントを公開するための
DefaultAuthenticationEventPublisher
(Javadoc) 。
Bean を追加することで、別の AuthenticationEventPublisher
(Javadoc) を提供できます。
MVC セキュリティ
デフォルトのセキュリティ構成は、SecurityAutoConfiguration
(Javadoc) と UserDetailsServiceAutoConfiguration
(Javadoc) に実装されています。SecurityAutoConfiguration
(Javadoc) は Web セキュリティ用に SpringBootWebSecurityConfiguration
をインポートし、UserDetailsServiceAutoConfiguration
(Javadoc) は認証を構成します。これは、Web 以外のアプリケーションにも関連します。
アクチュエーターセキュリティを含むデフォルトの Web アプリケーションセキュリティ構成を完全にオフにしたり、OAuth2 クライアントやリソースサーバーなどの複数の Spring Security コンポーネントを組み合わせたりするには、型 SecurityFilterChain
(Javadoc) の Bean を追加します (これにより、UserDetailsService
(Javadoc) 構成が無効になることはありません)。UserDetailsService
(Javadoc) 構成もオフにするには、型 UserDetailsService
(Javadoc) 、AuthenticationProvider
(Javadoc) 、または AuthenticationManager
(Javadoc) の Bean を追加します。
UserDetailsService
(Javadoc) の自動構成では、クラスパス上にある次の Spring Security モジュールもバックオフされます。
spring-security-oauth2-client
spring-security-oauth2-resource-server
spring-security-saml2-service-provider
これらの依存関係の 1 つ以上に加えて UserDetailsService
(Javadoc) を使用するには、独自の InMemoryUserDetailsManager
(Javadoc) Bean を定義します。
アクセスルールは、カスタム SecurityFilterChain
(Javadoc) Bean を追加することでオーバーライドできます。Spring Boot は、アクチュエーターエンドポイントと静的リソースのアクセスルールをオーバーライドするために使用できる便利なメソッドを提供します。EndpointRequest
(Javadoc) を使用すると、management.endpoints.web.base-path
プロパティに基づく RequestMatcher
(Javadoc) を作成できます。PathRequest
(Javadoc) を使用すると、よく使用される場所のリソースの RequestMatcher
(Javadoc) を作成できます。
WebFlux セキュリティ
Spring MVC アプリケーションと同様に、spring-boot-starter-security
依存関係を追加することで、WebFlux アプリケーションを保護できます。デフォルトのセキュリティ構成は、ReactiveSecurityAutoConfiguration
(Javadoc) および UserDetailsServiceAutoConfiguration
(Javadoc) に実装されています。ReactiveSecurityAutoConfiguration
(Javadoc) は Web セキュリティ用に WebFluxSecurityConfiguration
をインポートし、UserDetailsServiceAutoConfiguration
(Javadoc) は認証を構成します。これは、Web 以外のアプリケーションにも関連します。
アクチュエーターセキュリティを含むデフォルトの Web アプリケーションセキュリティ構成を完全にオフにするには、型 WebFilterChainProxy
(Javadoc) の Bean を追加します (これにより、UserDetailsService
(Javadoc) 構成が無効になることはありません)。UserDetailsService
(Javadoc) 構成もオフにするには、型 ReactiveUserDetailsService
(Javadoc) または ReactiveAuthenticationManager
(Javadoc) の Bean を追加します。
次の Spring Security モジュールのいずれかがクラスパス上にある場合も、自動構成はバックオフされます。
spring-security-oauth2-client
spring-security-oauth2-resource-server
これらの依存関係の 1 つ以上に加えて ReactiveUserDetailsService
(Javadoc) を使用するには、独自の MapReactiveUserDetailsService
(Javadoc) Bean を定義します。
アクセスルールと、OAuth 2 クライアントやリソースサーバーなどの複数の Spring Security コンポーネントの使用は、カスタム SecurityWebFilterChain
(Javadoc) Bean を追加することで構成できます。Spring Boot は、アクチュエーターエンドポイントと静的リソースのアクセスルールをオーバーライドするために使用できる便利なメソッドを提供します。EndpointRequest
(Javadoc) を使用すると、management.endpoints.web.base-path
プロパティに基づく ServerWebExchangeMatcher
(Javadoc) を作成できます。
PathRequest
(Javadoc) は、よく使用される場所にあるリソースの ServerWebExchangeMatcher
(Javadoc) を作成するために使用できます。
例: 次のようなものを追加して、セキュリティ構成をカスタマイズできます。
Java
Kotlin
import org.springframework.boot.autoconfigure.security.reactive.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration(proxyBeanMethods = false)
public class MyWebFluxSecurityConfiguration {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange((exchange) -> {
exchange.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll();
exchange.pathMatchers("/foo", "/bar").authenticated();
});
http.formLogin(withDefaults());
return http.build();
}
}
import org.springframework.boot.autoconfigure.security.reactive.PathRequest
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.Customizer.withDefaults
import org.springframework.security.config.web.server.ServerHttpSecurity
import org.springframework.security.web.server.SecurityWebFilterChain
@Configuration(proxyBeanMethods = false)
class MyWebFluxSecurityConfiguration {
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
http.authorizeExchange { spec ->
spec.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
spec.pathMatchers("/foo", "/bar").authenticated()
}
http.formLogin(withDefaults())
return http.build()
}
}
OAuth2
OAuth2 (英語) は、Spring でサポートされている広く使用されている認可フレームワークです。
クライアント
クラスパスに spring-security-oauth2-client
がある場合は、自動構成を利用して OAuth2/Open ID Connect クライアントを設定できます。この構成では、OAuth2ClientProperties
(Javadoc) のプロパティを使用します。同じプロパティがサーブレットアプリケーションとリアクティブアプリケーションの両方に適用されます。
次の例に示すように、spring.security.oauth2.client
プレフィックスに複数の OAuth2 クライアントとプロバイダーを登録できます。
プロパティ
YAML
spring.security.oauth2.client.registration.my-login-client.client-id=abcd
spring.security.oauth2.client.registration.my-login-client.client-secret=password
spring.security.oauth2.client.registration.my-login-client.client-name=Client for OpenID Connect
spring.security.oauth2.client.registration.my-login-client.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-login-client.scope=openid,profile,email,phone,address
spring.security.oauth2.client.registration.my-login-client.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.my-login-client.client-authentication-method=client_secret_basic
spring.security.oauth2.client.registration.my-login-client.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri={baseUrl}/authorized/user
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=client_secret_basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri={baseUrl}/authorized/email
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=client_secret_basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server.com/oauth2/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server.com/oauth2/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server.com/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server.com/oauth2/jwks
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
spring:
security:
oauth2:
client:
registration:
my-login-client:
client-id: "abcd"
client-secret: "password"
client-name: "Client for OpenID Connect"
provider: "my-oauth-provider"
scope: "openid,profile,email,phone,address"
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
client-authentication-method: "client_secret_basic"
authorization-grant-type: "authorization_code"
my-client-1:
client-id: "abcd"
client-secret: "password"
client-name: "Client for user scope"
provider: "my-oauth-provider"
scope: "user"
redirect-uri: "{baseUrl}/authorized/user"
client-authentication-method: "client_secret_basic"
authorization-grant-type: "authorization_code"
my-client-2:
client-id: "abcd"
client-secret: "password"
client-name: "Client for email scope"
provider: "my-oauth-provider"
scope: "email"
redirect-uri: "{baseUrl}/authorized/email"
client-authentication-method: "client_secret_basic"
authorization-grant-type: "authorization_code"
provider:
my-oauth-provider:
authorization-uri: "https://my-auth-server.com/oauth2/authorize"
token-uri: "https://my-auth-server.com/oauth2/token"
user-info-uri: "https://my-auth-server.com/userinfo"
user-info-authentication-method: "header"
jwk-set-uri: "https://my-auth-server.com/oauth2/jwks"
user-name-attribute: "name"
OpenID Connect ディスカバリ (英語) をサポートする OpenID Connect プロバイダーの場合、構成をさらに簡素化できます。プロバイダーは、発行者識別子としてアサートする URI である issuer-uri
を使用して構成する必要があります。例: 提供された issuer-uri
が "https://example.com" の場合、「OpenID プロバイダー構成リクエスト」が "https://example.com/.well-known/openid-configuration" に対して行われます。結果は "OpenID Provider Configuration Response" であると予想されます。次の例は、OpenID Connect プロバイダーを issuer-uri
で構成する方法を示しています。
プロパティ
YAML
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
spring:
security:
oauth2:
client:
provider:
oidc-provider:
issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"
デフォルトでは、Spring Security の OAuth2LoginAuthenticationFilter
(Javadoc) は /login/oauth2/code/*
に一致する URL のみを処理します。redirect-uri
をカスタマイズして別のパターンを使用する場合は、そのカスタムパターンを処理するための構成を提供する必要があります。例: サーブレットアプリケーションの場合、次のような独自の SecurityFilterChain
(Javadoc) を追加できます。
Java
Kotlin
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class MyOAuthClientConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.anyRequest().authenticated()
)
.oauth2Login((login) -> login
.redirectionEndpoint((endpoint) -> endpoint
.baseUri("/login/oauth2/callback/*")
)
);
return http.build();
}
}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.invoke
import org.springframework.security.web.SecurityFilterChain
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
open class MyOAuthClientConfiguration {
@Bean
open fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http {
authorizeHttpRequests {
authorize(anyRequest, authenticated)
}
oauth2Login {
redirectionEndpoint {
baseUri = "/login/oauth2/callback/*"
}
}
}
return http.build()
}
}
Spring Boot は、クライアント登録の管理のために Spring Security が使用する InMemoryOAuth2AuthorizedClientService (Javadoc) を自動構成します。InMemoryOAuth2AuthorizedClientService (Javadoc) の機能は制限されているため、開発環境でのみ使用することをお勧めします。本番環境では、JdbcOAuth2AuthorizedClientService (Javadoc) を使用するか、独自の OAuth2AuthorizedClientService (Javadoc) 実装を作成することを検討してください。 |
Common Provider の OAuth2 クライアント登録
Google、Github、Facebook、Okta などの一般的な OAuth2 プロバイダーと OpenID プロバイダーについては、プロバイダーのデフォルトのセット (それぞれ google
、github
、facebook
、okta
) が提供されています。
これらのプロバイダーをカスタマイズする必要がない場合は、provider
属性をデフォルトを推測する必要がある属性に設定できます。また、クライアント登録のキーがデフォルトでサポートされているプロバイダーと一致する場合、Spring Boot も同様に推測します。
つまり、次の例の 2 つの構成では Google プロバイダーを使用します。
プロパティ
YAML
spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google
spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: "abcd"
client-secret: "password"
provider: "google"
google:
client-id: "abcd"
client-secret: "password"
リソースサーバー
クラスパスに spring-security-oauth2-resource-server
がある場合、Spring Boot は OAuth2 リソースサーバーをセットアップできます。JWT 構成の場合、次の例に示すように、JWK セット URI または OIDC 発行者 URI を指定する必要があります。
プロパティ
YAML
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: "https://example.com/oauth2/default/v1/keys"
プロパティ
YAML
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"
認可サーバーが JWK Set URI をサポートしていない場合、JWT の署名の検証に使用される公開鍵でリソースサーバーを構成できます。これは、spring.security.oauth2.resourceserver.jwt.public-key-location プロパティを使用して実行できます。値は、PEM エンコードされた x509 形式の公開鍵を含むファイルを指す必要があります。 |
spring.security.oauth2.resourceserver.jwt.audiences
プロパティを使用して、JWT の aud クレームの予期される値を指定できます。例: JWT に値 my-audience
の aud クレームを含めるよう要求するには:
プロパティ
YAML
spring.security.oauth2.resourceserver.jwt.audiences[0]=my-audience
spring:
security:
oauth2:
resourceserver:
jwt:
audiences:
- "my-audience"
同じプロパティがサーブレットアプリケーションとリアクティブアプリケーションの両方に適用されます。または、サーブレットアプリケーション用に独自の JwtDecoder
(Javadoc) Bean を定義するか、リアクティブアプリケーション用に ReactiveJwtDecoder
(Javadoc) を定義することもできます。
JWT の代わりに Opaque トークンが使用されている場合は、次のプロパティを構成して、イントロスペクションを通じてトークンを検証できます。
プロパティ
YAML
spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
spring:
security:
oauth2:
resourceserver:
opaquetoken:
introspection-uri: "https://example.com/check-token"
client-id: "my-client-id"
client-secret: "my-client-secret"
繰り返しになりますが、サーブレットアプリケーションとリアクティブアプリケーションの両方に同じプロパティが適用されます。あるいは、サーブレットアプリケーション用に独自の OpaqueTokenIntrospector
(Javadoc) Bean を定義するか、リアクティブアプリケーション用に ReactiveOpaqueTokenIntrospector
(Javadoc) を定義することもできます。
認可サーバー
クラスパスに spring-security-oauth2-authorization-server
がある場合は、いくつかの自動構成を利用して、サーブレットベースの OAuth2 認可サーバーをセットアップできます。
次の例に示すように、spring.security.oauth2.authorizationserver.client
プレフィックスで複数の OAuth2 クライアントを登録できます。
プロパティ
YAML
spring.security.oauth2.authorizationserver.client.my-client-1.registration.client-id=abcd
spring.security.oauth2.authorizationserver.client.my-client-1.registration.client-secret={noop}secret1
spring.security.oauth2.authorizationserver.client.my-client-1.registration.client-authentication-methods[0]=client_secret_basic
spring.security.oauth2.authorizationserver.client.my-client-1.registration.authorization-grant-types[0]=authorization_code
spring.security.oauth2.authorizationserver.client.my-client-1.registration.authorization-grant-types[1]=refresh_token
spring.security.oauth2.authorizationserver.client.my-client-1.registration.redirect-uris[0]=https://my-client-1.com/login/oauth2/code/abcd
spring.security.oauth2.authorizationserver.client.my-client-1.registration.redirect-uris[1]=https://my-client-1.com/authorized
spring.security.oauth2.authorizationserver.client.my-client-1.registration.scopes[0]=openid
spring.security.oauth2.authorizationserver.client.my-client-1.registration.scopes[1]=profile
spring.security.oauth2.authorizationserver.client.my-client-1.registration.scopes[2]=email
spring.security.oauth2.authorizationserver.client.my-client-1.registration.scopes[3]=phone
spring.security.oauth2.authorizationserver.client.my-client-1.registration.scopes[4]=address
spring.security.oauth2.authorizationserver.client.my-client-1.require-authorization-consent=true
spring.security.oauth2.authorizationserver.client.my-client-2.registration.client-id=efgh
spring.security.oauth2.authorizationserver.client.my-client-2.registration.client-secret={noop}secret2
spring.security.oauth2.authorizationserver.client.my-client-2.registration.client-authentication-methods[0]=client_secret_jwt
spring.security.oauth2.authorizationserver.client.my-client-2.registration.authorization-grant-types[0]=client_credentials
spring.security.oauth2.authorizationserver.client.my-client-2.registration.scopes[0]=user.read
spring.security.oauth2.authorizationserver.client.my-client-2.registration.scopes[1]=user.write
spring.security.oauth2.authorizationserver.client.my-client-2.jwk-set-uri=https://my-client-2.com/jwks
spring.security.oauth2.authorizationserver.client.my-client-2.token-endpoint-authentication-signing-algorithm=RS256
spring:
security:
oauth2:
authorizationserver:
client:
my-client-1:
registration:
client-id: "abcd"
client-secret: "{noop}secret1"
client-authentication-methods:
- "client_secret_basic"
authorization-grant-types:
- "authorization_code"
- "refresh_token"
redirect-uris:
- "https://my-client-1.com/login/oauth2/code/abcd"
- "https://my-client-1.com/authorized"
scopes:
- "openid"
- "profile"
- "email"
- "phone"
- "address"
require-authorization-consent: true
my-client-2:
registration:
client-id: "efgh"
client-secret: "{noop}secret2"
client-authentication-methods:
- "client_secret_jwt"
authorization-grant-types:
- "client_credentials"
scopes:
- "user.read"
- "user.write"
jwk-set-uri: "https://my-client-2.com/jwks"
token-endpoint-authentication-signing-algorithm: "RS256"
client-secret プロパティは、構成された PasswordEncoder (Javadoc) と一致する形式である必要があります。PasswordEncoder (Javadoc) のデフォルトインスタンスは、PasswordEncoderFactories.createDelegatingPasswordEncoder() を介して作成されます。 |
Spring Boot が Spring Authorization Server に提供する自動構成は、すぐに開始できるように設計されています。ほとんどのアプリケーションはカスタマイズを必要とし、自動構成をオーバーライドするためにいくつかの Bean を定義する必要があります。
次のコンポーネントを Bean として定義して、Spring Authorization Server に固有の自動構成をオーバーライドできます。
com.nimbusds.jose.jwk.source.JWKSource<com.nimbusds.jose.proc.SecurityContext>
Spring Boot は、登録されたクライアントの管理のために Spring Authorization Server が使用する InMemoryRegisteredClientRepository (Javadoc) を自動構成します。InMemoryRegisteredClientRepository (Javadoc) の機能は制限されているため、開発環境でのみ使用することをお勧めします。本番環境では、JdbcRegisteredClientRepository (Javadoc) を使用するか、独自の RegisteredClientRepository (Javadoc) 実装を作成することを検討してください。 |
追加情報は、Spring Authorization Server リファレンスガイドの入門の章にあります。
SAML 2.0
証明書利用者
クラスパスに spring-security-saml2-service-provider
がある場合は、自動構成を利用して SAML 2.0 証明書利用者を設定できます。この構成では、Saml2RelyingPartyProperties
(Javadoc) のプロパティが使用されます。
証明書利用者登録は、ID プロバイダー IDP とサービスプロバイダー SP の間のペア構成を表します。次の例に示すように、spring.security.saml2.relyingparty
プレフィックスに複数の証明書利用者を登録できます。
プロパティ
YAML
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.decryption.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.decryption.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.singlelogout.url=https://myapp/logout/saml2/slo
spring.security.saml2.relyingparty.registration.my-relying-party1.singlelogout.response-url=https://remoteidp2.slo.url
spring.security.saml2.relyingparty.registration.my-relying-party1.singlelogout.binding=POST
spring.security.saml2.relyingparty.registration.my-relying-party1.assertingparty.verification.credentials[0].certificate-location=path-to-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party1.assertingparty.entity-id=remote-idp-entity-id1
spring.security.saml2.relyingparty.registration.my-relying-party1.assertingparty.sso-url=https://remoteidp1.sso.url
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.decryption.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.decryption.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.verification.credentials[0].certificate-location=path-to-other-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.entity-id=remote-idp-entity-id2
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.sso-url=https://remoteidp2.sso.url
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.singlelogout.url=https://remoteidp2.slo.url
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.singlelogout.response-url=https://myapp/logout/saml2/slo
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.singlelogout.binding=POST
spring:
security:
saml2:
relyingparty:
registration:
my-relying-party1:
signing:
credentials:
- private-key-location: "path-to-private-key"
certificate-location: "path-to-certificate"
decryption:
credentials:
- private-key-location: "path-to-private-key"
certificate-location: "path-to-certificate"
singlelogout:
url: "https://myapp/logout/saml2/slo"
response-url: "https://remoteidp2.slo.url"
binding: "POST"
assertingparty:
verification:
credentials:
- certificate-location: "path-to-verification-cert"
entity-id: "remote-idp-entity-id1"
sso-url: "https://remoteidp1.sso.url"
my-relying-party2:
signing:
credentials:
- private-key-location: "path-to-private-key"
certificate-location: "path-to-certificate"
decryption:
credentials:
- private-key-location: "path-to-private-key"
certificate-location: "path-to-certificate"
assertingparty:
verification:
credentials:
- certificate-location: "path-to-other-verification-cert"
entity-id: "remote-idp-entity-id2"
sso-url: "https://remoteidp2.sso.url"
singlelogout:
url: "https://remoteidp2.slo.url"
response-url: "https://myapp/logout/saml2/slo"
binding: "POST"
SAML2 ログアウトの場合、デフォルトでは、Spring Security の Saml2LogoutRequestFilter
(Javadoc) と Saml2LogoutResponseFilter
(Javadoc) は /logout/saml2/slo
に一致する URL のみを処理します。AP によって開始されたログアウトリクエストが送信される url
または AP がログアウトレスポンスを送信する response-url
をカスタマイズして別のパターンを使用する場合は、そのカスタムパターンを処理するための構成を提供する必要があります。例: サーブレットアプリケーションの場合、次のような独自の SecurityFilterChain
(Javadoc) を追加できます。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration(proxyBeanMethods = false)
public class MySamlRelyingPartyConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated());
http.saml2Login(withDefaults());
http.saml2Logout((saml2) -> saml2.logoutRequest((request) -> request.logoutUrl("/SLOService.saml2"))
.logoutResponse((response) -> response.logoutUrl("/SLOService.saml2")));
return http.build();
}
}