【问题标题】:Complex User Permissions in AngularAngular 中的复杂用户权限
【发布时间】:2014-06-02 21:41:52
【问题描述】:

我正在尝试隐藏和显示我的 Angular 应用程序的部分(稍后我会担心保护路线)

我遇到的问题是,后端正在返回数据库特定方面的 CRUD 权限。基于这些权限,我应该决定如何隐藏和显示 UI 的元素。然而,从来没有任何直接的一对一映射。

所以我需要根据各种权限组合来决定如何显示 UI 的各个部分。例如,“如果他们可以“阅读”插入订单或“阅读”财务”或“阅读”或“创建”拍卖,则显示报告选项卡。

但是,这是一个非常小的示例,通常权限要长得多,并且仅适用于应用程序的一部分。

我知道我将在 ng-show 中调用一个函数,但我只是不知道如何组织该函数以解决所有这些用例。

非常感谢任何想法。

这是一个返回的权限数组示例:

{
"account": [
    "read",
    "create",
    "update",
    "delete"
],
"an_advertiser": [
    "read",
    "create",
    "update",
    "delete"
],
"an_insertion_order": [
    "read",
    "create",
    "update",
    "delete"
],
"auction": [
    "read",
    "create",
    "update",
    "delete"
],
"dashboard": [
    "read",
    "create",
    "update",
    "delete"
],
"finance": [
    "read",
    "create",
    "update",
    "delete"
],
"input_output": [
    "read",
    "create",
    "update",
    "delete"
],
"insertion_order": [
    "read",
    "create",
    "update",
    "delete"
],
"publisher": [
    "read",
    "create",
    "update",
    "delete"
],
"report": [
    "read",
    "create",
    "update",
    "delete"
],
"user": [
    "read",
    "create",
    "update",
    "delete"
]
}

【问题讨论】:

  • 我不确定这是否会在受信任的环境中在内部使用,但是如果您信任客户端代码来执行您的安全策略,这听起来可能是一个安全漏洞.也许我误解了这个问题,但即使你隐瞒了粗鲁的行动,你也绝对不能相信客户的反馈。任何使用 Fiddler 之类的东西的人都可以修改从服务器发送的代码,修改它,然后再次运行。
  • 是的,它是一个内部工具,我们没有使用来自客户端的任何东西进行授权。这只是根据从服务器返回的用户权限隐藏和显示 UI 元素。

标签: javascript angularjs security authentication permissions


【解决方案1】:

这更像是一个建议,如果您选择更改系统的权限。

我认为您必须为权限添加一些层次结构。

我通常使用模块/动作。 所以一个模块可以有很多动作。 我也没有读取、创建、更新、删除(0:阻止,1:查看,2:可以)。

例子:

{
    user: {
         module: 2,
         create: 2,
         edit: 2,
         name: 2,
         phone: 1,
         delete: 2
    },
    report: {
         module: 1,
         create: 2,
         edit: 0,
         reportA: 1,
         reportB: 2,
         delete: 2
    }
}

这样我可以完全控制所有操作。一个模块可以是具有许多操作的应用程序的一部分。或者你可以使用一个包含所有组件的大模块,然后是子模块。

由于我对权限使用整数,因此我可以使用简单的<>= 符号进行验证。

我通常定义一个通用操作,如module 来定义此人是否有权访问整个模块。

function permTo(module, action){
  var mod = list[module];
  // not validating if module exists.
  var max = mod.module;
  return Math.min(mod[action], max);
}

现在有了这个permTo('users', 'phone') 会得到 1。

现在有了这个permTo('users', 'name') 会得到 2。

现在有了这个permTo('report', 'create') 会给出 1,因为模块是 1。

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多