【Spring Security】 Oauth2 authorities 授权
【Spring Security】 Oauth2 authorities 授权
Metadata
title: 【Spring Security】 Oauth2 authorities 授权
date: 2023-02-05 15:58
tags:
- 行动阶段/完成
- 主题场景/组件
- 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
- 细化主题/Module/SpringSecurity
categories:
- SpringSecurity
keywords:
- SpringSecurity
description: 【Spring Security】 Oauth2 authorities 授权
【Spring Security】 Oauth2 authorities 授权
在 oauth_client_details 表中,有一个 authorities 字段,从字面上来看是授权的意思,在之前我们分析了可以通过 resourceId 和 scope进行授权,那么这个 authorities 授权又是什么东东呢,接下来简单分析下。
流程分析
1. 授权服务器添加 authorities
首先给当前客户端添加一个权限值。
2. 获取令牌并访问资源服务器
可以看到,authorities 也会存在在用户信息中。
那么应该想到,这和 scope 差不多,也是可以通过表达式进行授权的。
接着我们在方法上加上这个下面这个表达式,表示客户端需要admin:user
角色值才能访问。
@PreAuthorize("#oauth2.clientHasRole('admin:user')") //
然后 Dubug 到OAuth2ExpressionUtils
的 clientHasAnyRole 方法。
public static boolean clientHasAnyRole(Authentication authentication, String... roles) {
if (authentication instanceof OAuth2Authentication) {
// 1. 获取到客户端信息
OAuth2Request clientAuthentication = ((OAuth2Authentication) authentication).getOAuth2Request();
// 2. 获取authorities信息 =》add:user
Collection<? extends GrantedAuthority> clientAuthorities = clientAuthentication.getAuthorities();
if (clientAuthorities != null) {
// 3. 判断是有有当前权限值,没有则返回false,报错。
Set<String> roleSet = AuthorityUtils.authorityListToSet(clientAuthorities);
for (String role : roles) {
if (roleSet.contains(role)) {
return true;
}
}
}
}
return false;
}
从代码中可以看到,Oauth2 的 authorities 对应了 Security 中的角色编码值。可用通过配置 Oauth2 客户端的角色,然后使用表达式 clientHasAnyRole 对授权进行控制。
总结
通过以上分析,原来 authorities 和 scope 一样,都是方法级别的权限控制。区别在于 scope 可以通过用户自己选择授权客户端拥有哪些权限,而 authorities 是定死的。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 蝶梦庄生!
评论