我正在使用一个关于用户权限的非常复杂逻辑的单页企业应用程序。它的大部分完全在客户端与后端服务器通信,使用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'}
]
在客户端上,它们以树状结构显示,如下所示:
现在是棘手的部分:
使用应用程序的简单用户可以查看树,但无法更改任何内容。
用户可以更改节点名称,如果他是节点的admins
或其任何父节点之一。
管理员还可以更改节点的状态,从STATUS_1
更改为STATUS_2
,但前提是所有子节点都具有STATUS_2
状态。
有一个超级管理员列表可以随心所欲:更改任何节点的属性,根据需要更改状态。
所以不知何故,在客户端上呈现树时,我需要知道用户可以或不能对页面上的每个节点做什么。我无法在整个应用程序中为用户分配角色,因为用户权限因节点而异。此外,我无法在客户端看到整个图片,因为可能未加载子节点。 如何在这种情况下管理用户权限?使用的正确方法或模式是什么?
我是否应该为每个节点附加一些角色对象,或者可能是一堆代表用户可以或不可以做的标志:
{
id: 12,
name: "Node name 1.2",
status: "STATUS_1",
canChangeName: true,
canChangeStatus: false
}
对我来说这看起来很傻。
答案 0 :(得分:2)
我通常使用ACL类在应用程序中解决复杂(而不是那么复杂)的基于权限的任务。
我有简单的轻量级类,它们将模型,正在检查的权限以及用户对象转换为构造函数。他们有一堆名为canXXXX()
的方法。如果需要,这些方法也可以选择性地采用一些参数。
如果你的正面和背面都有相同的模型类,你甚至可以在两种情况下都重复使用ACL。
你能用这种方法吗?