一、resource_id的作用

Spring Security OAuth2 架构上分为Authorization Server认证服务器和Resource Server资源服务器。咱们能够为每一个Resource Server(一个微服务实例)设置一个resourceid。Authorization Server给client第三方客户端受权的时候,能够设置这个client能够拜访哪一些Resource Server资源服务,如果没设置,就是对所有的Resource Server都有拜访权限。

二、ResourceServer如何设置ResourceID

在每个ResourceServer实例上设置resourceId,该resourceId作为该服务资源的惟一标识。(如果同一个微服务资源部署多份,resourceId雷同)

@Configuration@EnableResourceServerpublic class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {    private static final String DEMO_RESOURCE_ID = "test-resource";    @Override    public void configure(ResourceServerSecurityConfigurer resources) {        resources.resourceId(DEMO_RESOURCE_ID)        //...... 还能够有有其余的配置    } }

三、AuthorizationServer如何设置ResourceIDs

在AuthorizationServer为客户端client配置ResourceID的目标是:限度某个client能够拜访的资源服务。

@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {    //配置客户端存储到db 代替原来得内存模式    JdbcClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);    clientDetailsService.setPasswordEncoder(passwordEncoder);    clients.withClientDetails(clientDetailsService);}

这里须要应用JdbcClientDetailsService类和数据库表oauth_client_details进行配置的长久化存储,以及动静配置。

三、ResourceID在哪验证

ResourceID当然是在Resource Server资源服务器进行验证(你能不能拜访我的资源,当然由我本人来验证)。当资源申请发送到Resource Server的时候会携带access_token,Resource Server会依据access_token找到client_id,进而找到该client能够拜访的resource_ids。如果resource_ids蕴含ResourceServer本人设置ResourceID,这关就过来了,就能够持续进行其余的权限验证。

  • @EnableResourceServer会给Spring Security的FilterChan增加一个OAuth2AuthenticationProcessingFilter过滤器,过滤所有的资源申请。
  • OAuth2AuthenticationProcessingFilter会应用OAuth2AuthenticationManager来验证token。验证Token的时候会去oauth_client_details表加载client配置信息。

如果AuthorizationServer认证client1能够拜访test-resource,但client1去拜访了oauth-rs,会响应如下信息:

{"error":"access_denied","error_description":"Invalid token does not contain resource id (oauth-rs)"}

具体实现resource_id验证的源码:OAuth2AuthenticationManager#authenticate(Authentication authentication)

public Authentication authenticate(Authentication authentication) throws AuthenticationException {        if (authentication == null) {            throw new InvalidTokenException("Invalid token (token not found)");        }        String token = (String) authentication.getPrincipal();        OAuth2Authentication auth = tokenServices.loadAuthentication(token);        if (auth == null) {            throw new InvalidTokenException("Invalid token: " + token);        }        Collection<String> resourceIds = auth.getOAuth2Request().getResourceIds();        if (resourceId != null && resourceIds != null && !resourceIds.isEmpty() && !resourceIds.contains(resourceId)) {            throw new OAuth2AccessDeniedException("Invalid token does not contain resource id (" + resourceId + ")");        }        checkClientDetails(auth);        if (authentication.getDetails() instanceof OAuth2AuthenticationDetails) {            OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();            // Guard against a cached copy of the same details            if (!details.equals(auth.getDetails())) {                // Preserve the authentication details from the one loaded by token services                details.setDecodedDetails(auth.getDetails());            }        }        auth.setDetails(authentication.getDetails());        auth.setAuthenticated(true);        return auth;    }

上面这段便是验证resourceid的中央

Collection<String> resourceIds = auth.getOAuth2Request().getResourceIds();if (resourceId != null && resourceIds != null && !resourceIds.isEmpty() && !resourceIds.contains(resourceId)) {    throw new OAuth2AccessDeniedException("Invalid token does not contain resource id (" + resourceId + ")");}

在Spring Security的FilterChain中,OAuth2AuthenticationProcessingFilter在FilterSecurityInterceptor的后面,所以会先验证client有没有此resource的权限,只有在有此resource的权限的状况下,才会再去做进一步的进行其余验证的判断。

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》