oauth_client_details -----resource_ids------scope
user_------previllage(role)
关于资源的解释
https://andaily.com/blog/?cat=19
resource用于将系统提供的各类资源进行分组管理,每一个resource对应一个resource-id, 而一个client details至少要有一个resource-id(对应OauthClientDetails.java中的resourceIds字段).
在spring-oauth-server的security.xml配置文件的70行左右, 你会看到两行配置,如下:
<!--unity resource server filter--> <oauth2:resource-server id="unityResourceServer" resource-id="unity-resource" token-services-ref="tokenServices"/> <!--mobile resource server filter--> <oauth2:resource-server id="mobileResourceServer" resource-id="mobile-resource" token-services-ref="tokenServices"/>
这儿就是配置resource的地方, 看见里面的两个resource-id值.
在这配置往上, 能看见两个<http>的配置, 一个的pattern为/m/**, 另一个为/unity/**, 这就是资源与Spring Security整合后的配置, 注意每个<http>配置里的 ROLE_UNITY与ROLE_MOBILE, 这对应Spring Security的权限; 截图如下:
有了以上基础, 及下看我们要添加一个自己的resource, 假设resource-id = myResource, url pattern为/my/api/**, 权限为ROLE_MY_RESOURCE, scope为 read; 其配置如下:
1.添加<oauth2:resource-server> , resource-id=myResource, 如下:
<oauth2:resource-server id="myResourceServer" resource-id="myResource" token-services-ref="tokenServices"/>
注意, id值需要唯一
2.添加<http>配置, 如下:
<http pattern="/my/api/**" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint" access-decision-manager-ref="oauth2AccessDecisionManager" use-expressions="false"> <anonymous enabled="false"/> <intercept-url pattern="/my/api/**" access="ROLE_MY_RESOURCE,SCOPE_READ"/> <custom-filter ref="myResourceServer" before="PRE_AUTH_FILTER"/> <access-denied-handler ref="oauth2AccessDeniedHandler"/> <csrf disabled="true"/> </http>
说明: 一个<resource-server>可以配置多个<http>, 使用不同的url pattern
OK, 配置完成, 新增resource: myResource; 这时候, 所有以/my/api/** 开头的URL请求都将受到 OAUTH2的保护, 及下来在业务中创建client details, 记得把resourceIds设置为myResource,且要有ROLE_MY_RESOURCE的权限.