如何在单页面应用程序中处理用户权限

时间:2015-05-31 02:26:21

标签: 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. 用户可以更改节点名称,如果他是节点的admins或其任何节点之一。

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

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

  5. 所以不知何故,在客户端上呈现树时,我需要知道用户可以或不能对页面上的每个节点做什么。我无法在整个应用程序中为用户分配角色,因为用户权限因节点而异。此外,我无法在客户端看到整个图片,因为可能未加载子节点。 如何在这种情况下管理用户权限?使用的正确方法或模式是什么?

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

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

    对我来说这看起来很傻。

1 个答案:

答案 0 :(得分:2)

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

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

如果你的正面和背面都有相同的模型类,你甚至可以在两种情况下都重复使用ACL。

你能用这种方法吗?