如何在 Spring 配置文件中设置 WebSSOProfileConsumerImpl

Posted

技术标签:

【中文标题】如何在 Spring 配置文件中设置 WebSSOProfileConsumerImpl【英文标题】:How to set WebSSOProfileConsumerImpl in your Spring Configuration file 【发布时间】:2018-10-02 06:47:15 【问题描述】:

我面临将 WebSSOProfileConsumerImpl 指定到我的 Spring 配置文件的问题。我正在尝试修改此 bean 中的 responseSkew,但在为 WebSSOProfileConsumerImpl 添加配置后,我遇到了 MetadataManager 问题


应用程序启动失败


说明:

org.springframework.security.saml.websso.AbstractProfileBase 中方法 setMetadata 的参数 0 需要一个无法找到的 'org.springframework.security.saml.metadata.MetadataManager' 类型的 bean。

行动:

考虑定义一个 'org.springframework.security.saml.metadata.MetadataManager' 类型的 bean

谁能帮我解决这个问题?

我已经浏览了链接:http://docs.spring.io/spring-security-saml/docs/current/reference/html/configuration-advanced.html,但它没有指定如何在配置中进行设置。

我的代码

    import static org.springframework.security.extensions.saml2.config.SAMLConfigurer.saml;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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.saml.websso.WebSSOProfileConsumer;
import org.springframework.security.saml.websso.WebSSOProfileConsumerImpl;

@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    @Value("$security.saml2.metadata-url")
    String metadataUrl;

    @Value("$server.ssl.key-alias")
    String keyAlias;

    @Value("$server.ssl.key-store-password")
    String password;

    @Value("$server.port")
    String port;

    @Value("$server.ssl.key-store")
    String keyStoreFilePath;

    @Value("$security.saml2.responseSkew")
    int responseSkew = 0;


    @Override
    protected void configure(final HttpSecurity http) throws Exception 

        http
            .authorizeRequests()
                .antMatchers("/saml*").permitAll()
                .anyRequest().authenticated()
                .and()
            .apply(saml())
                .serviceProvider()
                    .keyStore()
                        .storeFilePath(this.keyStoreFilePath)
                        .password(this.password)
                        .keyname(this.keyAlias)
                        .keyPassword(this.password)
                        .and()
                    .protocol("https")
                    .hostname(String.format("%s:%s", "localhost", this.port))
                    .basePath("/")
                    .and()
                .identityProvider()
                .metadataFilePath(this.metadataUrl).and();

       /* Map<? extends Object, Object> sharedObjects = new Map<? extends Object>, Object>(http.getSharedObjects());
        sharedObjects.put(WebSSOProfileConsumer.class, webSSOprofileConsumerImpl());*/

    

    @Bean
    @Qualifier("webSSOprofileConsumer")
    public WebSSOProfileConsumer webSSOprofileConsumerImpl() 
        WebSSOProfileConsumerImpl consumerImpl = new WebSSOProfileConsumerImpl();
        consumerImpl.setResponseSkew(this.responseSkew);
        return consumerImpl;
     


【问题讨论】:

你有没有机会解决这个问题? 【参考方案1】:

如果您不需要将 WebSSOProfileConsumer 作为 bean 访问应用程序的其余部分,您可以在 configure 方法中创建它,如下所示:

@Override
protected void configure(final HttpSecurity http) throws Exception 
    WebSSOProfileConsumerImpl consumerImpl = new WebSSOProfileConsumerImpl();
    consumerImpl.setResponseSkew(this.responseSkew);

    http
        .authorizeRequests()
            .antMatchers("/saml*").permitAll()
            .anyRequest().authenticated()
            .and()
        .apply(saml())
            .serviceProvider()
                .ssoProfileConsumer(consumerImpl)  // <-- added here
                .keyStore()
                // Your method continues as before

我不记得在您的情况下常规连接失败的确切原因,但它的要点是 configure 设置了一个构建器对象而不是常规 bean。通常,ServiceProviderBuilder 会在其构建步骤中提供 WebSSOProfileConsumer 所需的 MetadataManager,但如果您自动装配配置文件使用者,您将不会获得为您提供的 MetadataManager,因为假定您的自动装配对象已经完成。

(我在寻找配置最大身份验证年龄的方法时了解到这一点,因为在某些情况下 spring-security-saml 中的两个小时默认值低于身份提供者使用的默认值。这有效地将您的用户锁定在您的应用程序,直到身份提供者的最大身份验证年龄已过。)

【讨论】:

我没有办法使用 serviceProvider 的“ssoProfileConsumer”方法。对此有何见解?

以上是关于如何在 Spring 配置文件中设置 WebSSOProfileConsumerImpl的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Netbeans 中设置环境变量?

Spring 如何在 Spring Boot 中设置数据源

如何在 Spring Boot 中的 DatabaseConfig 中设置属性

如何在 Spring Boot 中设置副本集?

如何在 Spring 测试中设置环境变量或系统属性?

如何在 Spring Data JPA 中设置 Hibernate 命名策略