Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展

Posted

技术标签:

【中文标题】Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展【英文标题】:Spring Security SAML extension on Spring framework 4.0 and Spring security 3.2.4 【发布时间】:2014-10-14 21:49:05 【问题描述】:

我想为基于 Spring 的应用程序使用注释配置。 SSO 还需要 SAML2.0 消化和生成。

注解配置仅受 Spring 4.0 和 Spring security 3.2.4 支持

是否可以集成 Spring security SAML 1.0?

更新: Vladimír Schäfer 提供的示例项目确实很有帮助。

但是在sso登录之后,页面已经被重定向到服务提供商应用上的认证失败URL。

SAML 响应如下:

 <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
            Destination="http://myIP:8080/websso/saml/SSO"
            ID="s237fe42260c297d9dfd7845b3691ef76e0bc27c76"
            InResponseTo="a14hc23eda9j396g2h5aff4076216g5"
            IssueInstant="2014-08-28T07:36:07Z"
            Version="2.0"
            >
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://idp.ssocircle.com</saml:Issuer>
    <samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
            <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"
                              xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                              />
    </samlp:Status>
    <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                    ID="s2e84d407027285a27d32a70c93ebdc70298956c8d"
                    IssueInstant="2014-08-28T07:36:07Z"
                    Version="2.0"
                    >
            <saml:Issuer>http://idp.ssocircle.com</saml:Issuer>
            <saml:Subject>
                    <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
                                 NameQualifier="http://idp.ssocircle.com"
                                 >nameID</saml:NameID>
                    <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
                            <saml:SubjectConfirmationData InResponseTo="a14hc23eda9j396g2h5aff4076216g5"
                                                          NotOnOrAfter="2014-08-28T07:46:07Z"
                                                          Recipient="http://myIP:8080/websso/saml/SSO"
                                                          />
                    </saml:SubjectConfirmation>
            </saml:Subject>
            <saml:Conditions NotBefore="2014-08-28T07:26:07Z"
                             NotOnOrAfter="2014-08-28T07:46:07Z"
                             >
                    <saml:AudienceRestriction>
                            <saml:Audience>entityID</saml:Audience>
                    </saml:AudienceRestriction>
            </saml:Conditions>
            <saml:AuthnStatement AuthnInstant="2014-08-28T07:35:44Z"
                                 SessionIndex="s274ab5c8a81ed49654745a6583214314f65138201"
                                 >
                    <saml:AuthnContext>
                            <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
                    </saml:AuthnContext>
            </saml:AuthnStatement>
    </saml:Assertion>
   </samlp:Response>

我怀疑这是因为 SP 的时区与 IDP 不同,我该如何跳过?

【问题讨论】:

来自 Spring security SAML 1.0 的参考手册 当前版本的 SAML Extension 已经过测试,可以与 Spring 3.1.2、Spring Security 3.1.2 和 OpenSAML 2.6.1 一起使用。这些库的更高版本可能无需修改即可兼容。 .你应该试试... 【参考方案1】:

查看answer:它基本上描述了我最近发布的一个插件,它允许您以这种方式配置 Spring Boot 和 Spring Security SAML:

@SpringBootApplication
@EnableSAMLSSO
public class SpringBootSecuritySAMLDemoApplication 

    public static void main(String[] args) 
        SpringApplication.run(SpringBootSecuritySAMLDemoApplication.class, args);
    

    @Configuration
    public static class MvcConfig extends WebMvcConfigurerAdapter 

        @Override
        public void addViewControllers(ViewControllerRegistry registry) 
            registry.addViewController("/").setViewName("index");
        
    

    @Configuration
    public static class MyServiceProviderConfig extends ServiceProviderConfigurerAdapter 
        @Override
        public void configure(ServiceProviderSecurityBuilder serviceProvider) throws Exception 
            serviceProvider
                .metadataGenerator()
                .entityId("localhost-demo")
            .and()
                .sso()
                .defaultSuccessURL("/home")
                .idpSelectionPageURL("/idpselection")
            .and()
                .logout()
                .defaultTargetURL("/")
            .and()
                .metadataManager()
                .metadataLocations("classpath:/idp-ssocircle.xml")
                .refreshCheckInterval(0)
            .and()
                .extendedMetadata()
                .idpDiscoveryEnabled(true)
            .and()
                .keyManager()
                .privateKeyDERLocation("classpath:/localhost.key.der")
                .publicKeyPEMLocation("classpath:/localhost.cert");

        
    

【讨论】:

【参考方案2】:

Spring SAML 似乎适用于 Spring 4.0 和 Spring Security 3.2.4。您可以使用spring-boot-security-saml-sample 项目作为参考。

下一个版本的 Spring SAML 很可能会包含对 Java 配置的额外支持,但正如上面的示例所示,可以让项目的所有内容都按原样工作。

【讨论】:

非常感谢。我的页面在 sso 登录后被重定向到身份验证失败 URL,saml 响应如上。可以请教吗? 嗨弗拉基米尔 - 是否有下一个版本的时间表(带有 Java 配置)?最好的,安德斯 嗨,不,抱歉,我最近没有太多空闲时间。

以上是关于Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展的主要内容,如果未能解决你的问题,请参考以下文章

Spring框架总结——概述

VS 2017 15.5 正式发布;Ant Design 3.0 性能改进;Spring Batch 4.0 发布

框架学习系列 之Spring框架学习总结

一起学Spring之Web基础篇

Spring MVC 入门示例讲解

spring简述