= spring-boot-demo-oauth-resource-server
Doc Writer <lzy@echocow.cn>
v1.0, 2019-01-09
:toc:

spring boot oauth2 资源服务器，同 授权服务器 一起使用。

> 使用 `spring security oauth`

- JWT 解密，远程公钥获取
- 基于角色访问控制
- 基于应用授权域访问控制

== jwt 解密

要先获取 jwt 公钥

[source,java]
.OauthResourceTokenConfig
----
public class OauthResourceTokenConfig {
    // ......
    private String getPubKey() {
        // 如果本地没有密钥，就从授权服务器中获取
        return StringUtils.isEmpty(resourceServerProperties.getJwt().getKeyValue())
            ? getKeyFromAuthorizationServer()
            : resourceServerProperties.getJwt().getKeyValue();
    }
    // ......
}
----

然后配置进去

[source, java]
.OauthResourceServerConfig
----
public class OauthResourceServerConfig extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources
            .tokenStore(tokenStore)
            .resourceId(resourceServerProperties.getResourceId());
    }
}
----

== 访问控制

通过 `@EnableGlobalMethodSecurity(prePostEnabled = true)` 注解开启 `spring security` 的全局方法安全控制

- `@PreAuthorize("hasRole('ADMIN')")` 校验角色
- `@PreAuthorize("#oauth2.hasScope('READ')")` 校验令牌授权域

== 测试

测试用例： `com.xkcoding.oauth.controller.TestControllerTest`

先获取 `token`，携带 `token` 去访问资源即可。
