如何在数据库中为嵌套视图构造用户权限?

时间:2019-03-15 22:29:16

标签: mongodb database-design relational-database schema user-permissions

我正在开发一个数据仪表板应用程序,该应用程序需要管理员的用户权限系统,该系统允许管理员根据用户身份轻松显示或隐藏站点地图的不同部分。

以下是我到目前为止提出的解决方案,但是我想听听那里有哪些替代方案,无论它是使用关系数据库还是非关系数据库(或两者都使用)。

我目前计划在我的MongoDB数据库中有一个users集合,该集合看起来像以下内容(auth由Auth0处理,不需要在这里存储东西)

[
  {
    _id: "e5jg",
    username: "demo",
    permissions: [ // ids in this array correspond to content ids in collection below
      "lk4n",
      "d30j",
      "hjyut",
    ]
  }
]

还将有一个类似于网站站点地图的dashboards集合。看起来像以下内容(假设给定父母的孩子永远不会与另一个父母共享-在应用程序中就是这种情况):

[
  {
    "_id": "9gtl",
    "dashboard": "Restaurants",
    "tools": [
      {
        "tool": "Management",
        "pages": [
          {
            "page": "Market Strategy",
            "cards": [
              {
                "card": "Top Priority Areas",
                "contents": [
                  {
                    "_id": "lk4n",
                    "content": "Regional Map",
                    "dataSource": "topPriorityMapData"
                  },
                  {
                    "_id": "78ty",
                    "content": "Stakeholders",
                    "dataSource": "stakeholdersData"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

我仅将用户与content级别的权限相关联,因为我确定如果某人有权访问站点地图的给定叶节点,那么他们会自动访问该节点的所有祖先。例如:由于拥有_id demo的{​​{1}}用户可以看到e5jg,因此他可以访问Regional Map卡,Top Priority Areas页面和{{1 }}仪表板。

只要更改权限(可通过尚未构建的UI界面控制),我计划:

  1. 更新用户集合并
  2. 以编程方式触发MongoDB聚合管道以加入Market Strategy集合和Restaurants集合,以创建users集合,该集合基本上由每个用户组成。如下所示:
dashboards

users.dashboards集合的目的是使用户登录应用程序时可以获取其特定站点地图。然后,前端将以编程方式使用该站点地图来生成用户可以看到的视图。

这种方法让我感到不舒服,尤其是在将[ { "username": "demo", "dashboards": [ { "dashboard": "Restaurants", "tools": [ "tool": "Management", "pages": [ { "page": "Market Strategy", "cards": [ { "card": "Top Priority Areas", "contents": [ { "content": "Regional Map", "dataSource": "topPriorityMapData" }, ] } ] } ] ] } ] } ] 集合整合到users.dashboards集合之前,必须进行疯狂的$unwind处理与dashboards。然后必须进行疯狂的users处理,以将每个用户重新嵌套在一起。

另一个问题是,尽管进行了$lookup和重新$group的所有操作,但我仍然需要对数据进行排序-也就是说,子级(仪表板,工具,页面,卡片,内容)返回到前端,理想情况下将保持与$unwind集合中最初列出的顺序相同。举例:如果有一个用户只能访问具有五个页面的工具中的一个页面,则应从她的站点地图中删除该页面,而其他页面则不会被洗牌。

为该应用程序构建用户权限系统的更好方法是什么?

0 个答案:

没有答案