@ EnableOAuth2Sso - 如何保护/取消保护资源?

时间:2015-05-27 19:55:56

标签: spring spring-security spring-boot spring-security-oauth2 spring-cloud

我正在尝试在Spring Cloud Security中使用@ EnableOAuth2Sso功能。具体来说,我试图用OAuth2保护一些资源,同时让其他资源公开访问。我已经设法使这个工作,但我正在查看生成的代码,并想知道是否有一个更清洁的方式。

我正在遵循此处的文档:https://github.com/spring-cloud/spring-cloud-security/blob/master/src/main/asciidoc/spring-cloud-security.adoc以及Spring Boot参考中的类似指导。我有一个很小的代码示例,说明了我的困境:https://github.com/kennyk65/oAuthSsoExample

简而言之,我希望localhost:8080 /不受保护的资源可公开使用,我希望localhost:8080 / protected资源需要OAuth2(通过github,如配置的那样)。我能够使基本的OAuth2行为正常工作,但导致/不受保护的公开可用是有问题的。

首先,文档表明您可以使用OAuth2SsoConfigurer的match()方法来指定要保护的资源。我发现这不起作用;当我尝试时,我得到一个IllegalStateException,说至少需要一个映射。这似乎是指未实现的configure(HttpSecurity)方法。

接下来,我尝试在configure(HttpSecurity)中指定一个映射,指出“不受保护”的资源应该不受保护。但是,这会导致将Http基本安全性应用于该资源。奇怪的是,这会导致“受保护”资源完全公开!

// This results in “unprotected” being protected by HTTP Basic
// and “protected” being completely open!   
@Configuration
protected static class OauthConfig extends OAuth2SsoConfigurerAdapter {
  @Override
  public void match(RequestMatchers matchers) {
    matchers.antMatchers("/protected/**");
  }

  @Override
  public void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/unprotected/**").permitAll();        
  }
}

我一时兴起试图故意添加受保护资源的身份验证。这导致受保护的资源获得OAuth2保护(欢呼!)但是未受保护的资源应用了http基本安全性(呵呵?)。

// This results in “protected” being protected by OAuth 2
// and “unprotected” being protected by HTTP Basic, even though we say permitAll(): 
@Configuration
protected static class OauthConfig extends OAuth2SsoConfigurerAdapter {
  @Override
  public void match(RequestMatchers matchers) {
    matchers.antMatchers("/protected/**");
  }

  @Override
  public void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/protected/**”).authenticated();      
        .antMatchers("/unprotected/**").permitAll();        
  }
}

在最后尝试找到魔法组合时,我尝试使用security.basic.enabled:false来关闭HTTP基本身份验证。这很有效(欢呼!),虽然我仍然有点疑惑这个映射的问题。

所以我想我的问题是,这是正确的吗?使用OAuth 2保护某些资源并让其他人独处的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

如果您在/protected/**上匹配,则向/unprotected/**添加访问规则是没有意义的(路径不匹配,因此规则永远不会应用)。您需要另一个过滤器链用于“未受保护”的资源,或者更广泛地匹配SSO。在前一种情况下,如果您不介意关闭它提供的安全性,那么从Spring Security获得的默认值就是这样。例如。

@Configuration
protected static class OauthConfig extends OAuth2SsoConfigurerAdapter {
  @Override
  public void match(RequestMatchers matchers) {
    matchers.antMatchers("/protected/**");
  }
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/**”).authenticated();      
  }
}

并设置security.basic.enabled=false