我正在开发一个关于用户权限的逻辑非常复杂的单页企业应用程序。它的很大一部分完全在客户端使用 AJAX 来回发送 JSON 与后端服务器通信。棘手的部分是我需要在每个实体的基础上实现许可机制,但我不知道如何以正确的方式做到这一点。
为了在这里清楚地解释我自己的示例代码,我在后端 User
和 Node
上有 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'}
]
在客户端,它们以树状结构显示,如下所示:
现在是棘手的部分:
使用应用程序的简单用户可以看到树,但不能更改任何内容。
如果用户是节点或其任何父节点的
管理员
,则他可以更改节点名称。管理员还可以更改节点的状态,从
STATUS_1
到STATUS_2
,但前提是所有 child 节点都具有STATUS_2
状态。有一个 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/