3 个版本
0.1.2 | 2020 年 5 月 20 日 |
---|---|
0.1.1 | 2020 年 5 月 20 日 |
0.1.0 | 2020 年 5 月 20 日 |
#311 in HTTP 客户端
在 comment_app_frontend 中使用
20KB
331 行
授权
授权是一个基于角色的访问控制 (RBAC) 库,用于查找 资源 上已登录 用户 的 权限。
资源 可以是 html 页面中的 复选框、按钮 或 文本区域。
权限可以用于 启用 / 禁用 / 查看 / 隐藏 html 页面中的复选框、输入文本、按钮等组件。
用户 - 角色 - 权限映射
以下两个映射文件被使用;它们是外部的;可以在任何文本编辑器中编辑
- 用户到角色映射文件(参考 sample_user-roles.json)
- 为每个资源,添加角色到权限的映射。(参考 sample_resource_permissions.json)
权限
资源可以拥有以下一个或多个权限类型
- C 创建(也称为添加)
- R 读取(即查看)
- U 更新(即编辑)
- D 删除(即删除)
说明
-
用户到角色 映射
假设,一个用户拥有仅查看的角色,可以创建如下映射
{ "user_id": "1000", "roles": ["viewer"] } Note: More than one role can be assigned within square bracket, like ["viewer", "supervisor"].
-
资源角色到权限 映射
假设资源是一个复选框。需要权限来启用/禁用它。角色到权限映射可以如下
{
"resource": "cb_enable",
"description": "enable or disable this checkbox",
"role2permissions": [
{"role": "viewer", "permission": "R", "condition": "{{resource_owner_id}} == {{session_user_id}}" },
{"role": "editor", "permission": "RU", "condition": "{{resource_owner_id}} == {{session_user_id}}" },
{"role": "admin", "permission": "CRUD" }]
}
注意
a. 在上面的 JSON 表示中,对于 cb_enable
资源,创建了三个角色到权限的映射。
b. 第一个角色是 查看者 角色,权限分配为 R
,表示 READ-ONLY
权限,在 条件 下,只有资源的所有者可以查看此复选框。
-
每个资源,当由用户创建时,用户成为其所有者,其用户 ID 被存储/持久化为 owner_id。
-
当他在以后的时间点登录应用程序时,将通过会话用户详细信息进行识别。
-
因此,将存储的 owner_id 与当前登录用户(也称为会话用户)进行比较。
-
a
Handlebars 模板表示法
用于定义此条件。 -
在此条件下,变量将被解析,然后进行比较。目前,只有简单的比较是可能的,例如:
a == b
,a < b
,...
c. 第二个角色是 编辑器 角色,其分配了 RU
,这意味着 READ 和 UPDATE
权限,在只有资源所有者可以查看和更新的条件下。
d. 第三个角色是 管理员 角色,其分配了 CRUD
,这意味着 所有权限: CREATE, READ, UPDATE, DELETE
。这里不需要任何条件。
如何使用
参考以下示例代码
let mut authzn = Authorization::load("./sample_resource_permissions.json", "./sample_user_roles.json");
let user_id = "1002";
authzn.set_permissions_for(user_id);
let resource = "cb_enable";
let owner_id = "1001";
let mut data = Map::new();
data.insert("resource_owner_id".to_string(), to_json( &owner_id ) );
data.insert("session_user_id".to_string(), to_json( &user_id) );
let mut permitted = authzn.allows_add(&user_id, &resource, &data);
if permitted { println!("CREATE PERMITTED"); } else { println!("Create NOT Permitted");}
permitted = authzn.allows_view(&user_id, &resource, &data);
if permitted { println!("VIEW PERMITTED"); } else { println!("View NOT Permitted");}
permitted = authzn.allows_edit(&user_id, &resource, &data);
if permitted { println!("EDIT PERMITTED"); } else { println!("Edit NOT Permitted"); }
permitted = authzn.allows_delete(&user_id, &resource, &data);
if permitted { println!("DELETE PERMITTED"); } else { println!("Delete NOT Permitted"); }
依赖项
~2.9–4MB
~82K SLoC