SAML 2.0 Metadata
Spring Security 可以剖析宣告方 Metadata 以產生 AssertingPartyDetails
實例,以及發佈依賴方 Metadata 從 RelyingPartyRegistration
實例。
剖析 <saml2:IDPSSODescriptor>
Metadata
您可以剖析宣告方的 Metadata 使用 RelyingPartyRegistrations
。
當使用 OpenSAML 供應商支援時,產生的 AssertingPartyDetails
將為 OpenSamlAssertingPartyDetails
類型。這表示您將能夠透過執行以下操作來取得底層的 OpenSAML XMLObject
-
Java
-
Kotlin
OpenSamlAssertingPartyDetails details = (OpenSamlAssertingPartyDetails)
registration.getAssertingPartyDetails();
EntityDescriptor openSamlEntityDescriptor = details.getEntityDescriptor();
val details: OpenSamlAssertingPartyDetails =
registration.getAssertingPartyDetails() as OpenSamlAssertingPartyDetails;
val openSamlEntityDescriptor: EntityDescriptor = details.getEntityDescriptor();
產生 <saml2:SPSSODescriptor>
Metadata
您可以使用 saml2Metadata
DSL 方法發佈 Metadata 端點,如下所示
-
Java
-
Kotlin
http
// ...
.saml2Login(withDefaults())
.saml2Metadata(withDefaults());
http {
//...
saml2Login { }
saml2Metadata { }
}
您可以使用此 Metadata 端點向宣告方註冊您的依賴方。這通常就像找到正確的表單欄位來提供 Metadata 端點一樣簡單。
預設情況下,Metadata 端點為 /saml2/metadata
,但它也會回應 /saml2/metadata/{registrationId}
和 /saml2/service-provider-metadata/{registrationId}
。
您可以透過在 DSL 中呼叫 metadataUrl
方法來變更此設定
-
Java
-
Kotlin
.saml2Metadata((saml2) -> saml2.metadataUrl("/saml/metadata"))
saml2Metadata {
metadataUrl = "/saml/metadata"
}
變更 RelyingPartyRegistration 的查找方式
如果您有不同的策略來識別要使用哪個 RelyingPartyRegistration
,您可以組態您自己的 Saml2MetadataResponseResolver
,如下所示
-
Java
-
Kotlin
@Bean
Saml2MetadataResponseResolver metadataResponseResolver(RelyingPartyRegistrationRepository registrations) {
RequestMatcherMetadataResponseResolver metadata = new RequestMatcherMetadataResponseResolver(
(id) -> registrations.findByRegistrationId("relying-party"));
metadata.setMetadataFilename("metadata.xml");
return metadata;
}
@Bean
fun metadataResponseResolver(val registrations: RelyingPartyRegistrationRepository): Saml2MetadataResponseResolver {
val metadata = new RequestMatcherMetadataResponseResolver(
id: String -> registrations.findByRegistrationId("relying-party"))
metadata.setMetadataFilename("metadata.xml")
return metadata
}