#role #rbac #access #handlebar #access-control

bin+lib 授权

基于角色的访问控制 (RBAC) 库

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 中使用

MIT 许可协议

20KB
331

授权

授权是一个基于角色的访问控制 (RBAC) 库,用于查找 资源 上已登录 用户权限

资源 可以是 html 页面中的 复选框按钮文本区域

权限可以用于 启用 / 禁用 / 查看 / 隐藏 html 页面中的复选框、输入文本、按钮等组件。

用户 - 角色 - 权限映射

以下两个映射文件被使用;它们是外部的;可以在任何文本编辑器中编辑

权限

资源可以拥有以下一个或多个权限类型

  • 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 == ba < b,...

c. 第二个角色是 编辑器 角色,其分配了 RU,这意味着 READUPDATE 权限,在只有资源所有者可以查看和更新的条件下。

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