结合SAML和后门登录的Spring Security

时间:2017-06-03 01:59:57

标签: spring spring-security spring-java-config spring-saml

我有一个通过SAML成功通过SSO提供程序进行身份验证的应用程序。但是,有少数用户需要通过常规登录框访问该站点。我希望将普通用户的流程重定向到SSO提供程序,但是为其他用户提供一个特殊页面选项(可能直接登录到登录页面)并让他们访问本地数据库。

我在为这两个用例组合JavaConfigs时遇到了麻烦。这是我的SAML配置:

    protected void configure(final HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/admin/**").hasAuthority(Authority.ADMIN.getAuthority())
        .and()
        .apply(SAMLConfigurer.saml())
        .userDetailsService(accountService)
        .serviceProvider()
        .keyStore()
        .storeFilePath("saml/keystore.jks")
        .password(this.password)
        .keyname(this.keyAlias)
        .keyPassword(this.password)
        .and()
        .protocol("https")
        .hostname(String.format("%s:%s", host, this.port))
        .basePath("/")
        .and()
        .identityProvider()
        .metadataFilePath(this.metadataUrl);
    }

这很好用,用户立即重定向,一切都很顺利。因此,如果我单独使用常规登录框,那么这样的工作就可以了:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/admin").hasAuthority(Authority.ADMIN.getAuthority()).and()
        .formLogin().loginPage("/login").successHandler(successHandler).loginProcessingUrl("/login").and()
        .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"));
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(accountService).passwordEncoder(passwordEncoder);
    }

但如果我试图以任何方式将这两者结合起来,他们似乎互相厮杀。我的第一次尝试是使用@Order注释,但如果我给SAML订单第一优先级,则登录表单不提交(显示405错误)。如果我将登录订单设为优先级,则每个人都会被重定向到登录页面而不是SSO页面。我如何将这些组合起来,以便在用户专门点击它时登录页面有效,但其他一切都被重定向到SSO?

0 个答案:

没有答案