|
@@ -16,75 +16,50 @@
|
|
|
|
|
|
package org.springframework.security.samples.config;
|
|
|
|
|
|
-import java.io.ByteArrayInputStream;
|
|
|
-import java.nio.charset.StandardCharsets;
|
|
|
-import java.security.PrivateKey;
|
|
|
-import java.security.cert.CertificateFactory;
|
|
|
import java.security.cert.X509Certificate;
|
|
|
|
|
|
-import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
|
|
+import org.opensaml.security.x509.X509Support;
|
|
|
+
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
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.configuration.WebSecurityConfigurerAdapter;
|
|
|
-import org.springframework.security.converter.RsaKeyConverters;
|
|
|
import org.springframework.security.saml2.core.Saml2X509Credential;
|
|
|
import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository;
|
|
|
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
|
|
|
-import org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationFilter;
|
|
|
-
|
|
|
-import static org.springframework.security.saml2.core.Saml2X509Credential.Saml2X509CredentialType.DECRYPTION;
|
|
|
-import static org.springframework.security.saml2.core.Saml2X509Credential.Saml2X509CredentialType.SIGNING;
|
|
|
-import static org.springframework.security.saml2.core.Saml2X509Credential.verification;
|
|
|
+import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
|
|
|
|
|
|
@EnableWebSecurity
|
|
|
-@EnableGlobalMethodSecurity(prePostEnabled = true)
|
|
|
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
|
|
|
- RelyingPartyRegistration getSaml2AuthenticationConfiguration() throws Exception {
|
|
|
- //remote IDP entity ID
|
|
|
- String idpEntityId = "https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/metadata.php";
|
|
|
- //remote WebSSO Endpoint - Where to Send AuthNRequests to
|
|
|
- String webSsoEndpoint = "https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/SSOService.php";
|
|
|
- //local registration ID
|
|
|
- String registrationId = "simplesamlphp";
|
|
|
- //local entity ID - autogenerated based on URL
|
|
|
- String localEntityIdTemplate = "{baseUrl}/saml2/service-provider-metadata/{registrationId}";
|
|
|
- //local signing (and decryption key)
|
|
|
- Saml2X509Credential signingCredential = getSigningCredential();
|
|
|
- //IDP certificate for verification of incoming messages
|
|
|
- Saml2X509Credential idpVerificationCertificate = getVerificationCertificate();
|
|
|
- String acsUrlTemplate = "{baseUrl}" + Saml2WebSsoAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI;
|
|
|
- return RelyingPartyRegistration.withRegistrationId(registrationId)
|
|
|
- .entityId(localEntityIdTemplate)
|
|
|
- .assertionConsumerServiceLocation(acsUrlTemplate)
|
|
|
- .signingX509Credentials((c) -> c.add(signingCredential))
|
|
|
- .assertingPartyDetails((config) -> config
|
|
|
- .entityId(idpEntityId)
|
|
|
- .singleSignOnServiceLocation(webSsoEndpoint)
|
|
|
- .verificationX509Credentials((c) -> c.add(idpVerificationCertificate)))
|
|
|
+ @Bean
|
|
|
+ RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() {
|
|
|
+ RelyingPartyRegistration relyingPartyRegistration = RelyingPartyRegistration.withRegistrationId("one")
|
|
|
+ .assertingPartyDetails((party) -> party
|
|
|
+ .entityId("https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/metadata.php")
|
|
|
+ .verificationX509Credentials((c) -> c.add(assertingPartyVerifyingCredential()))
|
|
|
+ .singleSignOnServiceLocation("https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/SSOService.php")
|
|
|
+ .wantAuthnRequestsSigned(false)
|
|
|
+ )
|
|
|
.build();
|
|
|
+ return new InMemoryRelyingPartyRegistrationRepository(relyingPartyRegistration);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected void configure(HttpSecurity http) throws Exception {
|
|
|
// @formatter:off
|
|
|
http
|
|
|
- .authorizeRequests()
|
|
|
+ .authorizeRequests((authz) -> authz
|
|
|
.anyRequest().authenticated()
|
|
|
- .and()
|
|
|
- .saml2Login()
|
|
|
- .relyingPartyRegistrationRepository(
|
|
|
- new InMemoryRelyingPartyRegistrationRepository(
|
|
|
- getSaml2AuthenticationConfiguration()
|
|
|
- )
|
|
|
- )
|
|
|
+ )
|
|
|
+ .saml2Login((saml2) -> saml2
|
|
|
.loginProcessingUrl("/sample/jc/saml2/sso/{registrationId}")
|
|
|
- ;
|
|
|
+ );
|
|
|
// @formatter:on
|
|
|
}
|
|
|
|
|
|
- private Saml2X509Credential getVerificationCertificate() {
|
|
|
- String certificate = "-----BEGIN CERTIFICATE-----\n" +
|
|
|
+ Saml2X509Credential assertingPartyVerifyingCredential() {
|
|
|
+ String bits =
|
|
|
"MIIEEzCCAvugAwIBAgIJAIc1qzLrv+5nMA0GCSqGSIb3DQEBCwUAMIGfMQswCQYD\n" +
|
|
|
"VQQGEwJVUzELMAkGA1UECAwCQ08xFDASBgNVBAcMC0Nhc3RsZSBSb2NrMRwwGgYD\n" +
|
|
|
"VQQKDBNTYW1sIFRlc3RpbmcgU2VydmVyMQswCQYDVQQLDAJJVDEgMB4GA1UEAwwX\n" +
|
|
@@ -106,57 +81,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
"ZnrV+oc2zGD+no1/ySFOe3EiJCO5dehxKjYEmBRv5sU/LZFKZpozKN/BMEa6CqLu\n" +
|
|
|
"xbzb7ykxVr7EVFXwltPxzE9TmL9OACNNyF5eJHWMRMllarUvkcXlh4pux4ks9e6z\n" +
|
|
|
"V9DQBy2zds9f1I3qxg0eX6JnGrXi/ZiCT+lJgVe3ZFXiejiLAiKB04sXW3ti0LW3\n" +
|
|
|
- "lx13Y1YlQ4/tlpgTgfIJxKV6nyPiLoK0nywbMd+vpAirDt2Oc+hk\n" +
|
|
|
- "-----END CERTIFICATE-----";
|
|
|
- return verification(x509Certificate(certificate));
|
|
|
- }
|
|
|
-
|
|
|
- private X509Certificate x509Certificate(String source) {
|
|
|
+ "lx13Y1YlQ4/tlpgTgfIJxKV6nyPiLoK0nywbMd+vpAirDt2Oc+hk";
|
|
|
try {
|
|
|
- final CertificateFactory factory = CertificateFactory.getInstance("X.509");
|
|
|
- return (X509Certificate) factory.generateCertificate(
|
|
|
- new ByteArrayInputStream(source.getBytes(StandardCharsets.UTF_8))
|
|
|
- );
|
|
|
+ X509Certificate certificate = X509Support.decodeCertificate(bits);
|
|
|
+ return Saml2X509Credential.verification(certificate);
|
|
|
} catch (Exception e) {
|
|
|
- throw new IllegalArgumentException(e);
|
|
|
+ throw new IllegalStateException(e);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- private Saml2X509Credential getSigningCredential() {
|
|
|
- String key = "-----BEGIN PRIVATE KEY-----\n" +
|
|
|
- "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANG7v8QjQGU3MwQE\n" +
|
|
|
- "VUBxvH6Uuiy/MhZT7TV0ZNjyAF2ExA1gpn3aUxx6jYK5UnrpxRRE/KbeLucYbOhK\n" +
|
|
|
- "cDECt77Rggz5TStrOta0BQTvfluRyoQtmQ5Nkt6Vqg7O2ZapFt7k64Sal7AftzH6\n" +
|
|
|
- "Q2BxWN1y04bLdDrH4jipqRj/2qEFAgMBAAECgYEAj4ExY1jjdN3iEDuOwXuRB+Nn\n" +
|
|
|
- "x7pC4TgntE2huzdKvLJdGvIouTArce8A6JM5NlTBvm69mMepvAHgcsiMH1zGr5J5\n" +
|
|
|
- "wJz23mGOyhM1veON41/DJTVG+cxq4soUZhdYy3bpOuXGMAaJ8QLMbQQoivllNihd\n" +
|
|
|
- "vwH0rNSK8LTYWWPZYIECQQDxct+TFX1VsQ1eo41K0T4fu2rWUaxlvjUGhK6HxTmY\n" +
|
|
|
- "8OMJptunGRJL1CUjIb45Uz7SP8TPz5FwhXWsLfS182kRAkEA3l+Qd9C9gdpUh1uX\n" +
|
|
|
- "oPSNIxn5hFUrSTW1EwP9QH9vhwb5Vr8Jrd5ei678WYDLjUcx648RjkjhU9jSMzIx\n" +
|
|
|
- "EGvYtQJBAMm/i9NR7IVyyNIgZUpz5q4LI21rl1r4gUQuD8vA36zM81i4ROeuCly0\n" +
|
|
|
- "KkfdxR4PUfnKcQCX11YnHjk9uTFj75ECQEFY/gBnxDjzqyF35hAzrYIiMPQVfznt\n" +
|
|
|
- "YX/sDTE2AdVBVGaMj1Cb51bPHnNC6Q5kXKQnj/YrLqRQND09Q7ParX0CQQC5NxZr\n" +
|
|
|
- "9jKqhHj8yQD6PlXTsY4Occ7DH6/IoDenfdEVD5qlet0zmd50HatN2Jiqm5ubN7CM\n" +
|
|
|
- "INrtuLp4YHbgk1mi\n" +
|
|
|
- "-----END PRIVATE KEY-----";
|
|
|
- String certificate = "-----BEGIN CERTIFICATE-----\n" +
|
|
|
- "MIICgTCCAeoCCQCuVzyqFgMSyDANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMC\n" +
|
|
|
- "VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEjAQBgNVBAcMCVZhbmNvdXZlcjEdMBsG\n" +
|
|
|
- "A1UECgwUU3ByaW5nIFNlY3VyaXR5IFNBTUwxCzAJBgNVBAsMAnNwMSAwHgYDVQQD\n" +
|
|
|
- "DBdzcC5zcHJpbmcuc2VjdXJpdHkuc2FtbDAeFw0xODA1MTQxNDMwNDRaFw0yODA1\n" +
|
|
|
- "MTExNDMwNDRaMIGEMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjES\n" +
|
|
|
- "MBAGA1UEBwwJVmFuY291dmVyMR0wGwYDVQQKDBRTcHJpbmcgU2VjdXJpdHkgU0FN\n" +
|
|
|
- "TDELMAkGA1UECwwCc3AxIDAeBgNVBAMMF3NwLnNwcmluZy5zZWN1cml0eS5zYW1s\n" +
|
|
|
- "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRu7/EI0BlNzMEBFVAcbx+lLos\n" +
|
|
|
- "vzIWU+01dGTY8gBdhMQNYKZ92lMceo2CuVJ66cUURPym3i7nGGzoSnAxAre+0YIM\n" +
|
|
|
- "+U0razrWtAUE735bkcqELZkOTZLelaoOztmWqRbe5OuEmpewH7cx+kNgcVjdctOG\n" +
|
|
|
- "y3Q6x+I4qakY/9qhBQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAAeViTvHOyQopWEi\n" +
|
|
|
- "XOfI2Z9eukwrSknDwq/zscR0YxwwqDBMt/QdAODfSwAfnciiYLkmEjlozWRtOeN+\n" +
|
|
|
- "qK7UFgP1bRl5qksrYX5S0z2iGJh0GvonLUt3e20Ssfl5tTEDDnAEUMLfBkyaxEHD\n" +
|
|
|
- "RZ/nbTJ7VTeZOSyRoVn5XHhpuJ0B\n" +
|
|
|
- "-----END CERTIFICATE-----";
|
|
|
- PrivateKey pk = RsaKeyConverters.pkcs8().convert(new ByteArrayInputStream(key.getBytes()));
|
|
|
- X509Certificate cert = x509Certificate(certificate);
|
|
|
- return new Saml2X509Credential(pk, cert, SIGNING, DECRYPTION);
|
|
|
- }
|
|
|
}
|