我最近升级到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路线。我仍然在这里留下这个问题,如果有人找到解决方法,可能会有用。
答案 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()。