使用oauth2范围而不是角色来保护弹簧执行器管理端点

时间:2017-02-16 17:32:58

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

我最近升级到Spring Cloud Dalston,这意味着Spring Boot 1.5.1,我无法通过检查oauth2范围来保护管理端点。它曾在Spring Cloud Camden中使用过。

这是之前有效的配置:

@Configuration
public class SecurityConfiguration extends ResourceServerConfigurerAdapter {

    @Value("${management.context-path}")
    private String managementContextPath;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests() 
                // some paths I don't want to secure at all
                .antMatchers("/path1/**", "/path2/**").permitAll() 
                // access to health endpoint is open to anyone
                .antMatchers(HttpMethod.GET, managementContextPath + "/health").permitAll() 
                // but app.admin scope is necessary for other management endpoints
                .antMatchers(managementContextPath + "/**").access("#oauth2.hasScope('my-super-scope')") //
                // And we make sure the user is authenticated for all the other cases
                .anyRequest().authenticated();
    }
}

这是配置的重要部分:

security:
  oauth2:
    client:
      clientId: a-client
      clientSecret: the-client-password
    resource:
      tokenInfoUri: http://my-spring-oauth2-provider/oauth/check_token

management:
  context-path: /my-context
  security:
    enabled: true
endpoints:
  health:
    sensitive: false

当我尝试在/my-context/refresh上发帖时,我得到一个HTTP 401"需要完全身份验证"即使我提供了有效的OAuth2令牌

查看日志,我看到我的请求被认为是匿名的,并且检查FilterChainProxy日志时发现OAuth2AuthenticationProcessingFilter未被调用。经过一些挖掘I found that I could change the oauth2 resource filter order,所以我尝试了,现在我有一个OAuth2身份验证,是的,完成了吗?

嗯,不,现在我有Access is denied. User must have one of the these roles: ACTUATOR错误。

我尝试了一些其他的事情,包括禁用管理安全性(但我的规则未应用,访问对所有人开放),玩(呃)@Order(没有变化),甚至,看见,reading and applying the documentation说:

  

要覆盖应用程序访问规则,请添加类型为@Bean   WebSecurityConfigurerAdapter并使用   @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)如果你不想   覆盖执行器访问规则,或   @Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER),如果你这样做   想要覆盖执行器访问规则。

但这并没有改变错误:User must have one of these roles: ACTUATOR

有人有解决方法/想法吗?

更新:我还使用Zuul,所以我最终创建了一个特定的zuul路由到我需要的端点(在我的情况下是云总线刷新),在其他后端服务上不受保护,否则没有暴露,并受到保护与oauth2的zuul路线。

我仍然在这里留下这个问题,如果有人找到解决方法,可能会有用。

2 个答案:

答案 0 :(得分:2)

可能是队长显而易见,但请看http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html。您可以使用management.security.roles覆盖该角色,只需添加您的Oauth2凭据所具有的任何角色。

答案 1 :(得分:1)

我也遇到了这个问题。我使用的解决方法是在我定义的新端点上公开执行器动作,然后调用执行器bean来处理请求。

例如,为了使用Oauth2保护/ my-context / refresh,我只是在{whatever-api-prefix} / refreshConfig处公开了一个新资源,并在该URL的其余控制器上公开了一个请求处理程序;在rest控制器中,我连接RefreshEndpoint bean,在请求处理程序中,我仅调用refreshEndpoint.refresh()。