我有一个通过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?