单个Spring Boot应用程序中的SAML和Oauth2

时间:2019-01-17 17:53:43

标签: spring-boot authentication

为了为我正在从事的项目开发通用身份服务,我需要在单个spring-boot应用程序中为UI页面支持基于Azure ADFS的SAML安全性,并为我的REST API支持基于Oauth2的安全性

我有一个Spring Boot应用程序,尝试为我的某些UI资源提供基于SAML的保护,并为我的REST API提供基于Oauth2的保护。 UI页面和REST API托管在同一基于Spring Boot的应用程序中。我有一个SecurityConfiguration类,它扩展了WebSecurityConfigurerAdapter并包含我的SAML配置。我还具有一个ResourceServerConfig类,该类扩展了ResourceServerConfigurerAdapter,在该类中,我尝试为REST API配置Oauth2身份验证。

这是我的代码的样子

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
{

/////// Other methods //////
@Override
protected void configure(HttpSecurity http) throws Exception
{
    http.authorizeRequests().anyRequest().authenticated();
    http.httpBasic().authenticationEntryPoint(samlEntryPoint());
    http.csrf().disable();
    http.addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class).addFilterAfter(samlFilter(), BasicAuthenticationFilter.class);
    http.authorizeRequests().antMatchers("/oauth/token").permitAll().anyRequest().authenticated();

}

ResourceServerConfig类如下所示

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends     ResourceServerConfigurerAdapter
{
@Override
public void configure(HttpSecurity http) throws Exception
{
    http
    .csrf().disable()
    .anonymous().and()
    .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS).permitAll()
        .antMatchers("/api/**").authenticated();
}

我的问题是,使用上述配置,我可以在我的UI页面上获得SAML保护,或者在我的API上获得Oauth2保护,但不能同时获得两者。如果我从ResourceServerConfig类中删除@EnableResourceServer并尝试访问我的UI页面之一,则可以可靠地将我重定向到microsoft Azure登录页面,该页面将在成功身份验证后将我重定向回我的UI页面。但是,与此相关的任何尝试(使用有效的承载令牌)访问我的api都会导致重定向到microsoft Azure登录页面。如果我重新启用@EnableResourceServer,我的API将得到保护并按预期方式运行,但是对所有UI页面的SAML保护将完全被spring禁用,从而允许无障碍访问所有UI资源。

我不知道如何告诉Spring Boot对我拥有的两种URL模式使用哪种身份验证框架。这样的事情有可能吗?

任何帮助,将不胜感激。

此致

Dipak Jha

1 个答案:

答案 0 :(得分:0)

我认为我已经找到了自己问题的答案。 This reply here提供了可行的解决方案。正确配置的OAuthRequestedMatcher似乎可以解决问题。请让我知道是否有人认为可以通过更好的方式完成此操作。

致谢

Dipak Jha