¶ 管理资源与权限
Authing 基于 PBAC(Policy Based Access Control,基于策略的访问控制)构建权限模型, 可以和 RBAC (Role Based Access Control,基于角色的访问控制)结合,实现非常灵活、精细化的权限控制。 此模块将此模型抽象成了两个方法: allow,isAllowed。
¶ 创建权限分组
managementClient.acl().createNamespace(code, name, description)
创建权限分组
¶ 参数
code
<String> 权限分组唯一标识符name
<String> 权限分组名description
<String> 可选,权限分组描述
¶ 示例
ResourceNamespace namespace = managementClient.acl().createNamespace(CODE, NAME, DESCRIPTION).execute();
¶ 示例数据
{
"appId": null,
"appName": null,
"name": "Test Namcepace",
"code": "testNamesapce",
"description": "This is a Test Namespace",
"status": 1,
"id": 38
}
¶ 获取权限分组列表
managementClient.acl().listNamespaces(page, limit)
获取权限分组列表
¶ 参数
page
<Integer> 页码,默认为 1。limit
<Integer> 每页个数,默认为 10。
¶ 示例
Pagination<ResourceNamespace> paginatedNamespace = managementClient.acl().listNamespaces().execute();
¶ 示例数据
{
"list": [
{
"appId": null,
"appName": null,
"name": "Test Namcepace",
"code": "testNamesapce",
"description": "This is a Test Namespace",
"status": 1,
"id": 38
}
],
"totalCount": 1
}
¶ 更新权限分组
managementClient.acl().updateNamespace(code, updates)
更新权限分组
¶ 参数
code
<String> 权限分组 Codeupdates
<UpdateNamespaceParams> 需要更新的数据updates.code
<String> 可选,权限分组唯一标识符。updates.name
<String> 可选,权限分组名称。updates.description
<String> 可选,权限分组描述。
¶ 示例
ResourceNamespace res = managementClient.acl().updateNamespace("CODE", new UpdateNamespaceParams("NAME", "CODE")).execute();
¶ 示例数据
{
"id": 38,
"appId": null,
"appName": null,
"name": "Test Namcepace",
"code": "testNamesapce",
"description": "A New Name",
"status": 1
}
¶ 删除权限分组
managementClient().acl.deleteNamespace(code)
删除权限分组
¶ 参数
code
<Integer> 权限分组 Code
¶ 示例
Boolean deleted = managementClient.acl().deleteNamespace("CODE").execute();
¶ 获取资源列表
managementClient.acl().listResources(namespace, type, limit, page, fetchAll)
根据筛选条件,查询用户池下的资源列表。
¶ 参数
namespace
<String> 权限分组命名空间type
<ResourceType> 资源类型,可选值为DATA
、API
、MENU
、UI
、BUTTON
。fetchAll
<Boolean> 是否拉取全部,true:是 false:否。limit
<Integer> 每页条目数量,默认是 10。page
<Integer> 分页,获取第几页,默认从 1 开始。
¶ 示例
Pagination<IResourceResponse> res = managementClient.acl().listResources().execute();
¶ 返回数据
{
"list": [
{
"id": "60646ed1c7a558f935c6d49c",
"createdAt": "2021-03-31T12:45:05.175Z",
"updatedAt": "2021-03-31T12:45:05.175Z",
"userPoolId": "600a8f29cead8fc0127f9da6",
"code": "pihh4j7j4ehh",
"actions": [
{
"name": "book:write",
"description": "图书写入操作"
}
],
"type": "DATA",
"description": "chair",
"namespaceId": 22997,
"apiIdentifier": null,
"namespace": "600a8f4e37708b363024a3ca"
}
],
"totalCount": 1
}
¶ 创建资源
managementClient.acl().createResource(options)
创建一个资源。
¶ 参数
options
<IResourceDto> 资源信息对象options.code
<String> 资源标识符,不可使用值userpool
、user
、application
、role
、group
、org
、*
、api
、resource-namespace
、custom-resource
options.namespace
<String> 权限分组命名空间options.type
<String> 资源类型,可选值为DATA
、API
、MENU
、UI
、BUTTON
。options.actions
<List<IAction>> 资源操作对象数组。其中 name 为操作名称,填写一个动词,description 为操作描述,填写述信息。IAction
:name
<String> 操作名称,description
<String> 描述信息。
options.description
<String> 资源描述信息
¶ 示例
String code = String.valueOf(new Date().getTime());
String namespace = "default";
ArrayList<IAction> list = new ArrayList<>();
list.add(new IAction("name", null));
IResourceDto iResourceDto = new IResourceDto(
code,
ResourceType.API,
null,
list,
namespace
);
IResourceResponse res = managementClient.acl().createResource(iResourceDto).execute();
¶ 返回数据
{
"userPoolId": "600a8f29cead8fc0127f9da6",
"code": "book",
"actions": [
{
"name": "book:write",
"description": "图书写入操作"
}
],
"type": "DATA",
"description": "book",
"namespaceId": 22997,
"createdAt": "2021-04-06T11:49:07.656Z",
"updatedAt": "2021-04-06T11:49:07.656Z",
"id": "606c4ab3d7fb66a8e1517132",
"apiIdentifier": null
}
¶ 根据资源代码查询资源
- managementClient.acl().findResourceByCode(code)
- managementClient.acl().findResourceByCode(code, namespace)
根据资源代码查询资源。
¶ 参数
code
<String> 资源标识符namespace
<String> 权限分组命名空间
¶ 示例
IResourceResponse res = managementClient.acl().findResourceByCode("code").execute();
¶ 返回数据
{
"userPoolId":"613094503c39c08026363668",
"code":"gW764",
"actions":[
{
"name":"Action1",
"description":"desc1"
}
],
"type":"DATA",
"description":"desc",
"namespaceId":46215,
"createdAt":"Sep 3, 2021 6:52:19 PM",
"updatedAt":"Sep 3, 2021 6:52:19 PM",
"id":"6131fe63a8de28f66ca847e6"
}
¶ 根据资源 ID 查询资源
managementClient.acl().getResourceById(id)
根据资源 ID 查询资源。
¶ 参数
id
<String> 资源 ID
¶ 示例
IResourceResponse execute = getClient().getResourceById(responseId).execute();
¶ 返回数据
{
"userPoolId":"613094503c39c08026363668",
"code":"gW764",
"actions":[
{
"name":"Action1",
"description":"desc1"
}
],
"type":"DATA",
"description":"desc",
"namespaceId":46215,
"createdAt":"Sep 3, 2021 6:52:19 PM",
"updatedAt":"Sep 3, 2021 6:52:19 PM",
"id":"6131fe63a8de28f66ca847e6"
}
¶ 更新资源
managementClient.acl().updateResource(code, options)
更新一个资源。
¶ 参数
code
<String> 资源标识符options
<IResourceDto> 资源信息对象options.namespace
<String> 资源所在的权限分组标识options.type
<String> 资源类型,可选值为DATA
、API
、MENU
、UI
、BUTTON
。param.actions
<List<IAction>> 资源操作对象数组。其中 name 为操作名称,填写一个动词,description 为操作描述,填写描述信息。IAction
:name
<String> 操作名称description
<String> 描述信息
options.description
<String> 资源描述信息
¶ 示例
String code = String.valueOf(new Date().getTime());
String namespace = "default";
ArrayList<IAction> list = new ArrayList<>();
list.add(new IAction("name", null));
IResourceDto iResourceDto = new IResourceDto(
code,
ResourceType.API,
null,
list,
namespace
);
IResourceResponse res = managementClient.acl().updateResource(code, iResourceDto).execute();
¶ 返回数据
{
"id": "606c4ab3d7fb66a8e1517132",
"createdAt": "2021-04-06T11:49:07.656Z",
"updatedAt": "2021-04-06T11:59:26.879Z",
"userPoolId": "600a8f29cead8fc0127f9da6",
"code": "book",
"actions": [
{
"name": "book:write",
"description": "图书写入操作2"
},
{
"name": "book:read",
"description": "图书读取操作2"
}
],
"type": "DATA",
"description": "新的描述",
"namespaceId": 22997,
"apiIdentifier": null
}
¶ 删除资源
managementClient.acl().deleteResource(code, namespace)
删除一个资源。
¶ 参数
code
<String> 资源标识符namespace
<String> 资源所在的权限分组标识
¶ 示例
Boolean deleted = managementClient.acl().deleteResource("CODE", "namespace").execute();
¶ 返回数据
true
¶ 允许某个用户对某个资源进行某个操作
managementClient.acl().allow(userId, action, resource)
允许某个用户对某个资源进行某个操作
¶ 参数
userId
<String> 用户 IDaction
<String> 操作名称,推荐使用 <resourceType>:<actionName> 的格式,如books:edit
,books:list
。resource
<String> 资源名称,必须为 <resourceType>:<resourceId> 格式或者为 _,如_
,books:123
,books:\*
。
¶ 示例
managementClient.acl().allow("userId", "action", "resource").execute();
¶ 批量撤回资源
managementClient.acl().revokeResource(params)
批量撤回某个授权主体的资源
¶ 参数
params.namespace
<String> 权限分组的 Code,详情请见使用权限分组管理权限资源。params.resource
<String> 资源名称,必须为 <resourceType>:<resourceId> 格式或者为 _,如_
,books:123
,books:\*
。params.opts
<List<RevokeResourceOpt>>params.opts.targetType.
<PolicyAssignmentTargetType> 被授权主体类型params.opts.targetIdentifier.
<String> 被授权主体唯一标识
¶ 示例
RevokeResourceParams params = new RevokeResourceParams();
params.setNamespace("default");
params.setResource("resource");
RevokeResourceOpt opt = new RevokeResourceOpt();
opt.setTargetType(PolicyAssignmentTargetType.USER);
opt.setTargetIdentifier("userId");
params.setOpts(Collections.singletonList(opt));
CommonMessage execute = managementClient.acl().revokeResource(params).execute();
¶ 判断某个用户是否对某个资源有某个操作权限
managementClient.acl().isAllowed(userId, resource, action)
判断某个用户是否对某个资源有某个操作权限
¶ 参数
userId
<String> 用户 IDaction
<String> 操作名称,推荐使用 <resourceType>:<actionName> 的格式,如books:edit
,books:list
。resource
<String> 资源名称,必须为 <resourceType>:<resourceId> 格式或者为 _,如_
,books:123
,books:\*
。
¶ 示例
Boolean allowed = managementClient.acl().isAllowed("user id", "resource", "action").execute();
¶ 获取用户被授权的所有资源列表
managementClient.acl().listAuthorizedResources(targetType, targetIdentifier, namespace, options)
获取一个用户被授权的所有资源,用户被授权的所有资源里面包括从角色、分组、组织机构继承的资源。
¶ 参数
targetType
<PolicyAssignmentTargetType> 被授权主体类型targetIdentifier
<String> 被授权主体唯一标识namespace
<String> 权限分组的 Code,详情请见使用权限分组管理权限资源。options
<ListAuthorizedResourcesOptions>options.resourceType
<String> 可选,资源类型,默认会返回所有有权限的资源,现有资源类型如下:DATA
:数据类型;API
:API 类型数据;MENU
:菜单类型数据;BUTTON
:按钮类型数据。
¶ 示例
ListAuthorizedResourcesOptions options = new ListAuthorizedResourcesOptions(ResourceType.DATA);
PaginatedAuthorizedResources res = managementClient.acl().listAuthorizedResources(PolicyAssignmentTargetType.USER, user.getId(), "default", options).execute()
¶ 获取角色被授权的所有资源列表
managementClient.roles().listAuthorizedResources(params)
获取一个角色被授权的所有资源。
¶ 参数
param
<ListRoleAuthorizedResourcesParam>param.code
<String> 角色 Codeparam.namespace
<String> 权限分组的 Code,详情请见使用权限分组管理权限资源。param.resourceType
<String> 可选,资源类型,默认会返回所有有权限的资源,现有资源类型如下:DATA
:数据类型;API
:API 类型数据;MENU
:菜单类型数据;BUTTON
:按钮类型数据。
¶ 示例
ListRoleAuthorizedResourcesParam param = new ListRoleAuthorizedResourcesParam("123")
.withNamespace("default")
.withResourceType("DATA");
PaginatedAuthorizedResources res = managementClient.roles().listAuthorizedResources(param).execute();
¶ 示例数据
type
资源类型code
资源描述符,如果是DATA
类型资源,格式为resourceType:resourceId
,如books:*
表示所有书籍,books:1
表示 ID 为 1 的书籍。actions
用户被授权对该资源的操作
{
"totalCount": 12,
"list": [
{
"code": "menu_a",
"type": "MENU"
},
{
"code": "menu_b",
"type": "MENU"
},
{
"code": "books:1",
"type": "DATA",
"actions": ["books:delete", "books:update"]
}
]
}
¶ 获取分组被授权的所有资源列表
managementClient.group().listAuthorizedResources(param)
获取一个分组被授权的所有资源。
¶ 参数
param
<ListGroupAuthorizedResourcesParam>param.code
<String> 分组 Codeparam.namespace
<String> 权限分组的 Code,详情请见使用权限分组管理权限资源。param.resourceType
<String> 可选,资源类型,默认会返回所有有权限的资源,现有资源类型如下:DATA
:数据类型;API
:API 类型数据;MENU
:菜单类型数据;BUTTON
:按钮类型数据。
¶ 示例
ListGroupAuthorizedResourcesParam param = new ListGroupAuthorizedResourcesParam("code")
.withNamespace("default")
.withResourceType("DATA");
Group res = managementClient.group().listAuthorizedResources(param).execute();
¶ 示例数据
type
资源类型code
资源描述符,如果是DATA
类型资源,格式为resourceType:resourceId
,如books:*
表示所有书籍,books:1
表示 ID 为 1 的书籍。actions
用户被授权对该资源的操作
{
"totalCount": 12,
"list": [
{
"code": "menu_a",
"type": "MENU"
},
{
"code": "menu_b",
"type": "MENU"
},
{
"code": "books:1",
"type": "DATA",
"actions": ["books:delete", "books:update"]
}
]
}
¶ 获取部门被授权的所有资源列表
managementClient.org().listAuthorizedResourcesByNodeId(param)
获取一个部门被授权的所有资源。
¶ 参数
param
<ListNodeByIdAuthorizedResourcesParam>param.nodeId
<String> 部门 IDparam.namespace
<String> 权限分组的 Code,详情请见使用权限分组管理权限资源。param.resourceType
<String> 可选,资源类型,默认会返回所有有权限的资源,现有资源类型如下:DATA
:数据类型;API
:API 类型数据;MENU
:菜单类型数据;BUTTON
:按钮类型数据。
¶ 示例
ListNodeByIdAuthorizedResourcesParam param = new ListNodeByIdAuthorizedResourcesParam("ORG_ID")
.withNamespace("default")
.withResourceType("DATA");
Node res = managementClient.org().listAuthorizedResourcesByNodeId(param).execute();
¶ 示例数据
type
资源类型code
资源描述符,如果是DATA
类型资源,格式为resourceType:resourceId
,如books:*
表示所有书籍,books:1
表示 ID 为 1 的书籍。actions
用户被授权对该资源的操作
{
"totalCount": 12,
"list": [
{
"code": "menu_a",
"type": "MENU"
},
{
"code": "menu_b",
"type": "MENU"
},
{
"code": "books:1",
"type": "DATA",
"actions": ["books:delete", "books:update"]
}
]
}
¶ 获取具备某些资源操作权限的主体
managementClient.acl().getAuthorizedTargets(options)
传入权限分组、资源标识、资源类型、操作权限项、主体类型,返回具备资源操作权限的主体标识符。
¶ 参数
options
<AuthorizedTargetsParam> 筛选条件对象options.namespace
<String> 权限分组的 Code,详情请见使用权限分组管理权限资源。options.resourceType
<ResourceType> 资源类型,现有资源类型如下:DATA
:数据类型;API
:API 类型数据;MENU
:菜单类型数据;BUTTON
:按钮类型数据。
options.actions
<AuthorizedTargetsActionsInput> 操作actions.op
<String> 可选值为AND
、OR
,表示 list 中的操作关系是和还是或。actions.list
<List<String>> 操作,例如['read', 'write']
。
options.targetType
<PolicyAssignmentTargetType> 主体类型,可选值为USER
、ROLE
、ORG
、GROUP
,含义为用户、角色、组织机构节点、用户分组。
¶ 示例
AuthorizedTargetsParam book = new AuthorizedTargetsParam("6063f88dabb536e9a23a6c80", ResourceType.DATA,"book");
PaginatedAuthorizedTargets res = managementClient.acl().getAuthorizedTargets(book).execute();
¶ 示例数据
targetType
主体类型targetIdentifier
主体标识符,可能是用户 ID、角色 ID、组织结构节点 ID、用户分组 ID。actions
用户被授权对该资源的操作
{
"totalCount": 1,
"list": [
{
"targetType": "USER",
"targetIdentifier": "6063fcd01d0d2e39d4596904",
"actions": ["write"]
}
]
}
¶ 资源授权
managementClient.acl().authorizeResource(namespace, resourceCode, inputs)
将一个(类)资源授权给用户、角色、分组、组织机构,且可以分别指定不同的操作权限
¶ 参数
namespace
<String> 传入配置项resourceCode
<String> 资源 Codeinputs
<List<AuthorizeResourceOptInput>> 资源授权对象targetType
<PolicyAssignmentTargetType> 主体类型,可选值为USER
、ROLE
、GROUP
、ORG
。targetIdentifier
<String> 主体标识符,可以为用户 id、角色标识符、分组标识符、组织机构节点标识符。actions
<List<String>> 资源操作对象的名称的集合
¶ 示例
List<AuthorizeResourceOptInput> inputs = new ArrayList<>();
AuthorizeResourceOptInput input = new AuthorizeResourceOptInput(PolicyAssignmentTargetType.USER, user.getId(),
Arrays.asList("Action1"));
inputs.add(input);
AuthorizeResourceOptInput input2 = new AuthorizeResourceOptInput(PolicyAssignmentTargetType.ROLE, role.getCode(),
Arrays.asList("Action1"));
inputs.add(input2);
managementClient.acl().authorizeResource("default", resourceCode, inputs).execute());
¶ 示例数据
{"message":"授权资源成功","code":200}
¶ 刷新编程访问账号密钥
managementClient.acl().refreshProgrammaticAccessAccountSecret(param)
刷新编程访问账号密钥
¶ 参数
param
<IProgrammaticAccessAccountProps> 编程访问账号信息param.id
<String> 编程访问账号 IDparam.secret
<String>> 编程访问账号秘钥
¶ 示例
managementClient.acl().refreshProgrammaticAccessAccountSecret(new IProgrammaticAccessAccountProps("id", "secret")).execute();
¶ 示例数据
{
"id":"613202b22dfe14ceb3c29133",
"createdAt":"2021-09-03T11:10:42.458Z",
"updatedAt":"2021-09-03T11:10:44.244Z",
"appId":"61309451a88c76f88ea63836",
"secret":"bcf7f9fea856b15665ceb914458e29df",
"remarks":"",
"tokenLifetime":600,
"enabled":true
}
¶ 编程访问账号列表
managementClient.acl().programmaticAccessAccountList(param)
编程访问账号列表
¶ 参数
param
<IProgrammaticAccessAccountListProps> 编程访问账号信息param.appId
<String> 应用 IDparam.limit
<Integer> 每页个数 默认值:10
。param.page
<Integer> 页码数 默认值:1
。
¶ 示例
managementClient.acl().programmaticAccessAccountList(new IProgrammaticAccessAccountListProps("appId")).execute();
¶ 示例数据
{
"id":"613202b22dfe14ceb3c29133",
"createdAt":"2021-09-03T11:10:42.458Z",
"updatedAt":"2021-09-03T11:10:44.244Z",
"appId":"61309451a88c76f88ea63836",
"secret":"bcf7f9fea856b15665ceb914458e29df",
"remarks":"",
"tokenLifetime":600,
"enabled":true
}
¶ 添加编程访问账号
managementClient.acl().createProgrammaticAccessAccount(param)
添加编程访问账号
¶ 参数
param
<ICreateProgrammaticAccessAccountProps> 编程访问账号信息param.appId
<String> 应用 IDparam.remarks
<String> 备注param.tokenLifetime
<Integer> token 存活时间
¶ 示例
managementClient.acl().createProgrammaticAccessAccount(new ICreateProgrammaticAccessAccountProps("appId")).execute();
¶ 示例数据
{
"id":"6135df20aca5398ec949dd56",
"createdAt":"2021-09-06T09:28:00.133Z",
"updatedAt":"2021-09-06T09:28:00.133Z",
"appId":"61309451a88c76f88ea63836",
"secret":"31467e25a51a8e97c5fc15fd98bddec5",
"remarks":"",
"tokenLifetime":600,
"enabled":true
}
¶ 删除编程访问账号
managementClient.acl().deleteProgrammaticAccessAccount(programmaticAccessAccountId)
删除编程访问账号
¶ 参数
programmaticAccessAccountId
<String> 编程访问账号 ID
¶ 示例
managementClient.acl().deleteProgrammaticAccessAccount("id").execute();
¶ 示例数据
true
¶ 启用编程访问账号
managementClient.acl().enableProgrammaticAccessAccount(programmaticAccessAccountId)
启用编程访问账号
¶ 参数
programmaticAccessAccountId
<String> 编程访问账号 ID
¶ 示例
managementClient.acl().enableProgrammaticAccessAccount("id").execute();
¶ 示例数据
{
"id":"6135dffe0e00ddfcb2059595",
"createdAt":"2021-09-06T09:31:42.990Z",
"updatedAt":"2021-09-06T09:31:43.704Z",
"appId":"61309451a88c76f88ea63836",
"secret":"490f888890afe70835c80c5c96466474",
"remarks":"",
"tokenLifetime":600,
"enabled":true
}
¶ 禁用编程访问账号
managementClient.acl().disableProgrammaticAccessAccount(programmaticAccessAccountId)
禁用编程访问账号
¶ 参数
programmaticAccessAccountId
<String> 编程访问账号 ID
¶ 示例
managementClient.acl().disableProgrammaticAccessAccount("id").execute();
¶ 示例数据
{
"id":"6135e5428e7b130697128390",
"createdAt":"2021-09-06T09:54:10.239Z",
"updatedAt":"2021-09-06T09:54:11.746Z",
"appId":"61309451a88c76f88ea63836",
"secret":"48d78736579dd37d189e4dbe25916348",
"remarks":"",
"tokenLifetime":600,
"enabled":false
}