# 授权数据来源
当给某个角色授予的相应的权限后,角色用户就具备了一定的权限,这些授权后的数据可以通过 /$perms 接口获取到。 这里不得不提下,为了应对复杂的系统集成场景,低代码平台支持三种授权数据来源。
- 固定来源:来自 SSO Token,JWT 解出来后里面带了相应的 SCOPE 权限数据;
- 应用内授权数据;
- IAM统一授权数据:来自IAM统一授权平台的权限数据;
对于低代码应用,默认是应用内授权模式,也可以配置成 IAM 统一授权模式,不同的模式都是相当于对固定权限来源的拓展,计算后会合并成最终的权限集合。
# 固定来源
来自 SSO Token,解出来后里面带了相应的 SCOPE 权限数据。(注意是 不带 AR_{ 前缀以及 } 后缀的权限)。
- 如何调试当前身份有哪些固定 SCOPE 权限?
- 【推荐】携带请求的 token,调用 SSO 的
POST /oauth2/introspect接口:
$ curl -k -X POST \
-H "Content-type:application/x-www-form-urlencoded" \
-u "${clientId}:${clientSecret}" \
"https://${ssoServer}/oauth2/introspect" \
-d "token=${accesss_token}"
返回结果参考:
{
"...": "...",
"scope": "admin create AR_{\"resources\":{\"...\":{\"actions\":[...]%2C\"dataScopes\":{...}}}}"
}
解析后的 SCOPE 权限有:admin、create。
- 在业务代码中,获取 Spring 的 Authorization 对象,拿取 authorities 判断前缀或后缀:
需要注意的是,这里获取到的权限可能是经过拓展(如单应用模式)后的权限集合
private static Set<String> getScopes() {
Collection<? extends GrantedAuthority> authorities = Security.getCurrentAuthentication().getAuthorities();
Set<String> scopes = new HashSet<>(authorities.size());
for (GrantedAuthority authority : authorities) {
if (authority.getAuthority().startsWith("SCOPE_")) {
String scope = StringUtils.removeStart(authority.getAuthority(), "SCOPE_");
if (scope.startsWith("AR_{") && scope.endsWith("}")) {
continue;
}
scopes.add(scope);
}
}
return scopes;
}
# 权限模式
模式配置如下:
app:
dengine:
security:
# 权限模式,APP-单应用模式;IAM-IAM模式
mode: APP
# 单应用模式
单应用是指自己维护当前应用工程的权限/授权信息,低代码提供了一套基于常见场景设计的权限定义+角色权限授权用户的单应用管理流程。
// TODO:
# IAM 模式
对接 IAMSSO 时,我们在验证 access token 时可能会在返回的 scope 中携带AR{...}这种格式的 scope,属于资源权限,会区别于普通的 SCOPE 权限,是 IAM 对当前身份已授权的权限集合:
{
"...": "...",
"scope": "admin create AR_{\"resources\":{\"...\":{\"actions\":[...]%2C\"dataScopes\": {...}}}}"
}
对于低代码工程,只有在 IAM 模式下该AR{...}资源权限才会生效,用户需要在 IAM 控制台管理自己的权限包并授权。
使用文档:https://openfuse.bingosoft.net/sso/docs/authority/authority-setting.html (opens new window)。
# 应用场景
目前权限控制大体可分为前端与后端接口两部分,假设当前用户身份授权如下:
- 固定权限:token 验证返回 admin、create 两个 SCOPE 权限
- 通过权限模式配置资源权限(选其一):
单应用:添加名为r1的资源权限,资源权限关联create操作,并绑定角色授权给该用户
IAM:IAM 控制台导入拥有r1资源及资源操作create的权限包,并授权给该用户,此时 token 验证会返回AR_{...}资源权限:
{
"scope": "admin create AR_{\"resources\": {\"r1\": {\"actions\": [\"create\"]}}}"
}
下面可以根据具体的应用场景查看可基于哪些权限进行控制。
# 前端导航/页面组件控制
前端的权限控制,是基于在首次打开界面时访问的/$perms接口返回的当前用户拥有的权限集合进行判断,该集合是 SCOPE 权限与资源权限的合并。假设按照文档开始描述的授权的权限,/$perms接口将返回:
{
"admin": "",
"create": "",
"r1": {
"create": ""
}
}
打开IDE,在导航、页面或页面的某个组件中,可以看到权限控制栏,选择启用+点击自定义可见如下(其中导航会额外有[表达式]设置):

- 【权限关联】下拉选择+【自定义权限】回车配置:都是配置多个明确命名的权限,若所有权限都存在于
/$perms接口返回的 key 中,则表示拥有该导航/页面/页面组件。像图示例中设置了需要create权限,则该用户可见。
自定义权限作用:在权限关联下拉选择没有理想选项时支持自定义配置
- 【表达式】:Spel 表达式,可进行且或运算,如
hasScope('create') || hasScope('admin'),用于比较复杂的判断场景,需要注意的是,表示的方法严格区分权限类型,比如hasScope只能判断 SCOPE 权限,更多使用可见Spring 官方文档 (opens new window),可调用方法见fly.security.authz.method.ExtendedMethodSecurityExpressionRoot类。