javascript - 单页应用中如何处理用户权限

标签 javascript design-patterns architecture client server

我正在开发一个关于用户权限的逻辑非常复杂的单页企业应用程序。它的很大一部分完全在客户端使用 AJAX 来回发送 JSON 与后端服务器通信。棘手的部分是我需要在每个实体的基础上实现许可机制,但我不知道如何以正确的方式做到这一点。

为了在这里清楚地解释我自己的示例代码,我在后端 UserNode 上有 2 个实体类:

class User {
    Long id;
}
class Node {
    Long id;
    String name;
    Status status;
    Node parent;
    List<User> admins;
}
enum Status {
    STATUS_1, STATUS_2
}

我将父节点的 JSON 发送到服务器:

{id: 1, name: "Node name 1", status: 'STATUS_1'}

并接收带有一堆子节点的 JSON:

[
    {id: 11, name: "Node name 1.1", status: 'STATUS_1'}, 
    {id: 12, name: "Node name 1.2", status: 'STATUS_1'}
]

在客户端,它们以树状结构显示,如下所示:

UI

现在是棘手的部分:

  1. 使用应用程序的简单用户可以看到树,但不能更改任何内容。

  2. 如果用户是节点或其任何节点的管理员,则他可以更改节点名称。

  3. 管理员还可以更改节点的状态,从 STATUS_1STATUS_2,但前提是所有 child 节点都具有 STATUS_2 状态。

  4. 有一个 super 管理员列表,他们可以为所欲为:更改任何节点的属性,根据需要更改状态。

所以不知何故,在客户端呈现树的过程中,我需要知道用户可以或不能对页面上的每个节点做什么。我不能只在整个应用程序中为用户分配一个 Angular 色,因为用户权限因节点而异。我也看不到客户端的全貌,因为可能没有加载子节点。 在这种情况下如何管理用户权限?什么是正确的使用方式或模式?

我是否应该将一些 Angular 色对象附加到每个节点,或者可能是一堆代表用户可以或不能这样做的标志:

{ 
    id: 12, 
    name: "Node name 1.2", 
    status: "STATUS_1", 
    canChangeName: true,
    canChangeStatus: false
}

我觉得这很傻。

最佳答案

我通常使用 ACL 类在应用程序中解决复杂(和不太复杂)的基于权限的任务。

我有一个简单的轻量级类,它们将一个模型、正在检查的权限和一个用户对象放入构造函数中。他们有一堆名为 canXXXX() 的方法。如果需要,这些方法也可以选择采用一些参数。

如果前后都有相同的模型类,您甚至可以在两种情况下重用 ACL。

你能使用这种方法吗?

关于javascript - 单页应用中如何处理用户权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553229/

相关文章:

c++ - C++中的观察者模式

c++ - 从具有多重继承的派生类调用所有基类的公共(public)命名方法

architecture - 设置初始 Snowflake 环境的最佳实践 - 多个 URL

architecture - 滥用领域驱动设计

javascript - 在谷歌柱形图中的条形图上显示类型名称

javascript - 实际使用脚本异步或延迟等框架

javascript - 如何将颜色选择器功能集成到动态文本字段中

javascript - 带有最小值/最大值的向上/向下按钮

c++ - 架构 : Modifying the model in different ways

javascript - Redux 与自定义钩子(Hook)