如何建立关系模型(类似 GitHub)权限?

2023-11-23

tl;dr:我如何实现像(例如)github 的权限模型

更新以尝试解决 @philipxy 的一些评论:

我计划实现一个类似于 github 的权限模型:

  1. users
  2. 用户可以分组
  3. 用户可以在组织中
  4. 团体可以在组织中
  5. a user will be permitted any of C, R, U, and D operations on an asset, group, or organization as:
    1. 已被允许进行这些(C、R、U、D 中的任何一项)操作的个人用户
    2. 已被授予这些权限的组的成员
    3. a member of an organization that has been granted those permissions
      1. 或作为组的成员,其中该组属于具有权限的组织
  6. 用户被授予“读取”权限,因为资产/组/组织对匿名用户(“公共”)是可见的(可读)
  7. a user should also have a set of permissions to say whether they can do any of C, R, U, or D on the permissions (a user can create a permission[C,R,U,D] for another user, a group, or an org)
    1. 用户可以为他们创建的任何资产、组或组织,或者他们被授予设置权限的任何资产、组或组织设置权限。

这些权限将控制谁可以对站点中的资产、组和组织执行创建、读取、更新和删除 (CRUD) 操作。

我大约如何建模?

显然我有这些模型:

  1. Asset
  2. User
  3. Group
  4. 组织

接下来是什么?

  1. 允许?
  2. PermissionType(捕获 C/R/U/D)?

我正在从节点使用mysql(通过sequelize),但我自己可以弄清楚具体的语法,我只是还没有弄清楚如何从概念上做到这一点。

更多 @philipxy 的观点:

您建议我做更多的事情确实是我认为我正在寻求帮助的事情。也就是说,那些信息设计方法(NIAM、FCO-IM、ORM2、IDEF1X)就是我正在寻找的。我对关系数据库了解相当多执行(学习规范化和规范形式等的时间),但实际上,指定业务需求并将其转换为可操作规范的过程是一个挑战。

  • ORM2 is difficult to find because of name collisions with the nodejs module. : I have downloaded the book linked from the NIAM wikipedia page
  • 现在 NIAM 好像不太常用了?
  • FCO-IM:我已经从他们的网站下载了这本书
  • IDEF1X:看起来也很有趣

我想我会拿起一本数据库教科书。

针对谓词的更多工作:

  1. U识别出一个User
  2. A识别一个Asset
  3. G识别出一个Group
  4. a User U可以是0个或多个Groups G
  5. O识别一个Organization
  6. a User U可以是0个或多个Organizations O
  7. a Group G可以是0个或多个Organizations O
  8. 一项资产A可以由一个创建User U
  9. CRUD on Assets:
    1. an Entity E可以被允许(通过Permission P?) 执行操作Ac on Assets
    2. those Actions are:
      1. Create
      2. Read
      3. Update
      4. Delete
    3. the Entity may be of types:
      1. User
      2. Group
      3. Organization
      4. Anonymous User/“公众”
    4. details (shown only for Read, but also relevant for Create, Update, and Delete):
      1. a User U0可以允许另一个User U1 to Read an Asset A
      2. a User U0可以允许Users U谁是成员Group G to Read an Asset A
      3. a User U0可以允许Users U谁是成员Organization O to Read an Asset A
      4. Users U in Group G1, where G1 is a Group那是在一个Organization O已被允许Read Asset A,因此允许Read Asset A
  10. a Permission P that references an Asset A may only be created by certain users:
    1. 默认情况下,User U谁是一个的创造者Entity可以创造Permissions为了那个原因Entity,
    2. 但他们可能只参考Assets他们有Permission(在基本情况下:那些Assets创建者U)
    3. a User谁曾是Grant(?)ed特权也可以参考Entity E in a Permission
    4. Gr identifies a Grant
      1. a Grant给出一个Entity创建、读取、更新或删除的权限Permissions引用另一个Entity
      2. like Permissions, Grants have a transitive nature in that:
        1. if Organization O已经Granted(例如)修改的特权Permissions for Entity E, then
        2. not only may Users who are members of O modify Permissions referencing E,
          1. 但是也Users谁是任何成员Group G where G is in O有权限修改Permissions参考E

谓词和表

A 主张是对业务情况的真实或错误的陈述。 A谓词是一个列参数化语句,给定一行给出一个命题。表(基础或查询结果)保存根据其谓词得出真命题的行。

user (with id) U has name N
R is a grantor (may grant permissions)

user U has permission to update asset A
grantor R gave permission to grantor E to use an operator of type 'CRUD'
grantor E is of type 'user' AND grantor E has permission to update assets

商业规则

业务规则是定义术语或描述策略或流程的始终正确的语句。

A user is uniquely identified by an id assigned when their cheque clears.  
A crudable is an asset, group or organization.  
A grantor is a user, group, organization.
"Grantee" refers to a grantor receiving or holding a permission.    
Users can be in organizations.  

您可以创建无参数谓词的 true 语句。这些可以使用由以下方式绑定的参数名称FOR ALL & FOR SOME (THERE EXISTS)。以此类命题谓词和/或表名表述的业务规则是数据库限制. Given User(U,N) & Grantor(R)作为上面前两个谓词的简写作为表的谓词User & Grantor,以下几行都说同样的事情:

A user is a grantor.
FOR ALL U, if U is a user then U is a grantor.

FOR ALL U, (FOR SOME N, User(U, N)) IMPLIES Grantor(U).
(SELECT U FROM User) ⊆ (SELECT R AS U FROM Grantor).

FOR ALL U & N, User(U, N) IMPLIES Grantor(U).
FOR ALL U & N, (U, N) IN User IMPLIES (U) IN Grantor.

FOREIGN KEY User (U) REFERENCES Grantor (R);说明上面的作用(注意它与中间两个的相似性)加上 R 在 Grantor 中是 UNIQUE NOT NULL。

不要将规则与谓词混淆。它们有不同的用途,通常也有不同的形式。 (无参数句子模板可以用作其中之一。)规则是真实的陈述;规则是真实的陈述;规则是真实的陈述。谓词是参数化语句。看看我的回答如何区分他们。基表以及查询结果表有谓词。但规则可能建议您需要一个基本谓词/表来记录某些内容。当我们从规则中看到我们必须记录有关当前情况的一些陈述时,我们就有基本谓词/表。请注意,某些规则不激发任何基本谓词。

你可能想要reify类型和权限。

A user is a grantor of type 'user'.
Permission named 'C' is permission for a grantee to create a crudable.

Grantor E is of type 'user'.
Permission P is of type 'CRUD'.
Grantor R gave permission P of type 'CRUD' on crudable C to grantee E.

设计是找到必要和充分的规则和基本谓词

以下是相关谓词,用于记录您的说明中建议出现的情况。

  1. users
U identifies a user
  1. 用户可以分组
G identifies a group
user U is in group G
  1. 用户可以在组织中
O identifies an organization
user U is in organization O
  1. 团体可以在组织中
group G is in organization O
  1. 用户将被允许对资产、组或组织进行 CRUD 操作
A identifies a crudable of type 'asset'
user U is permitted CRUD operations on crudable C

5.1 作为个人用户,或作为群组成员,或作为组织成员(或作为群组成员,其中该群组属于具有权限的组织),

P identifies a permission
organization O is permitted CRUD operations on crudable C

或者因为资产/组/组织对于匿名用户(“公众”)是可见的(可读的)

crudable C is public
  1. 用户还应该有一组权限来说明是否可以设置上述权限
grantor R has permission to set CRUD permission for users on crudable C --?  

什么是“上述权限”?也许你的意思是用户CRUD权限和组织CRUD权限?也许您的意思是创建、读取等操作有单独的权限?你需要更清楚。

“一组权限”中有哪些权限?这里的“许可”实际上是指“对特定受让人的特别许可”吗?你需要更清楚。

更清晰的方法是给出尽可能简单的规则和谓词,但也不要简单到没有提及相关实体/值。之后您可能希望将多个规则和谓词概括为单个规则和谓词。例如,不处理用户、团体、组织和资产,而是拥有授予者和可信任者:Grantors may grant permissions. & grantor R gives permission P to grantee E。如果某些此类权限也与特定的受让人相关联,您可能还需要诸如grantor R gives permission P to grantee E re permission Q and grantee F.

6.1.用户可以为他们创建的任何资产、组或组织设置权限,

user U created crudable C

或他们被授予设置权限的任何资产、组或组织。

user U has permission to set permission P for crudable C --?  

你会想要记录类似的事情user U has name N and ....

了解数据库设计

搜索数据库/SQL 子类型/继承/多态性习语。例如,用户、组和组织是权限拥有者和持有者的类型;我将它们设为类型授予者的子类型。也许您想要某种权限目标类型,它是可授权者和授予者的联合。也许您想要权限类型。也许某些权限具有关联的被授予者。也许“C”、“R”、“U”和“D”是权限,“CRUD”是一种权限。您可能想要记录授予者向受让人授予了哪些权限。

稍后,如果连接位于共享 PK/UNIQUE 上且两者具有相同的值集,则我们可以通过连接来替换表。当我们可以连接 PK/UNIQUE 和 FK 时,我们可以将表替换为与它们的连接类似的表,但 FK 可为空。还有其他时候,我们可以毫无问题地替换多个表。但首先要确定基本谓词。

了解关系数据库设计。遵循一些信息设计方法。最好的是 NIAM/FCO-IM/ORM2 系列的成员。查看 IDEF1X。不要依赖产品。

了解约束。他们follow来自谓词和业务规则。它们是关于谓词可能的业务情况的事实。同样,它们是关于表中可能的数据库状态的事实。还可以了解 SQL 中的约束,包括声明式(PK、UNIQUE、FK)和触发式约束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何建立关系模型(类似 GitHub)权限? 的相关文章

  • 如何将react-native与php一起使用并获取返回数据始终为空

    我的回报始终为空 我似乎无法让它发挥作用 我如何将react native与php一起使用并获取json 任何人都可以帮忙吗 PHP myArray array myArray lat POST lat myArray lng POST l
  • 如何使用线程在 C# 中依次运行 3 个方法?

    我有三种方法 即方法1 方法2和方法3 方法1用于从一个站点下载图像 方法2用于从第二个站点下载图像 方法3用于比较图像 Method1 获取根据产品 id 逐一添加到列表中的图像 url 列表 即多个产品 id 的集合上有一个循环 然后根
  • jQuery - 将日期选择器的容器设置为特定的 div

    我在 div 上使用 jQuery UI 日期选择器 div通过移动鼠标隐藏和显示 因为日期选择器存在于末尾标签 不在我的 div 内 当我将鼠标移动到日期选择器时 div 消失 我像这样加载了日期选择器 JavaScript dt1 da
  • 使用其他应用程序打开 pdf

    我正在应用程序中显示 pdf 文件 我想在 nag bar 上显示 打开方式 选项 显示 iPhone 上安装的可以打开相同 pdf 的应用程序 如果用户选择任何应用程序 例如 pdf 查看器 则应该使用 pdf 查看器应用程序打开 pdf
  • WPF - 将窗口置于前面

    我有一个 WPF 窗口 我没有关闭它 相反 我执行 Hide 和 Show 它 现在 当我双击记录上网格中的主窗口时 这将触发 Show 窗口 该窗口将始终显示在主窗口后面 我尝试过以下方法 但没有成功 view Show view Act
  • 如何在javascript中访问请求查询字符串参数?

    我见过许多利用 RegEx 的解决方案 坦率地说 这似乎有些可笑 因为 javascript 是如此通用 必须有一种更简单的方法来访问请求参数 有人可以给我演示一下吗 我发现了一个有用的方法网的深度 http www dotnetbull
  • Java/Android 字符串到颜色的转换

    我正在制作一个应用程序 我希望能够通过用户输入 edittext 和十六进制值设置各种颜色 例如 eeeeee等等 问题是我似乎不知道如何转换它们 如果我在代码中做这样的事情 它工作得很好 标题栏 setBackgroundColor 0x
  • Haskell 中的相互递归求值器

    Update 我已经添加一个答案 https stackoverflow com questions 3524485 mutually recursive evaluator in haskell 4504200 4504200这描述了我的
  • Elasticsearch 将字符串与模糊字段相匹配

    我正在尝试将字符串与字段匹配 并且只想应用模糊性 例如 对于这些文档 title replace oilfilter title replace motoroil 以下查询应仅匹配第一个文档 Replace oilfilter Replac
  • Qt 5.15 mingw 文件夹 bin 中缺少调试 dll *d.dll

    我通过 Qt 维护工具安装了 Qt Creator 和 Qt5 15 但我在 mingw 的 bin 文件夹中缺少像 QtCored dll 这样的调试 dll 我该怎么办 None
  • MKAnnotationView 的不同字体

    在iPhone SDK地图上的标注气泡上 可以更改标题和副标题属性的字体吗 我对标注气泡中显示的默认字体不满意 并且希望使用不同的字体来匹配我的应用程序的其余部分 然而 我没有看到太多提及这一点 这让我担心这可能是不可能的 我见过构建自定义
  • 从 C# 应用程序调用 ASP.net Web 服务

    我有个问题 我如何调用 Web 服务并从 C 桌面应用程序获取结果 我正在制作一个桌面应用程序 我希望它能够连接到我的在线 ASP net Web 服务 这怎么可能 在 解决方案资源管理器 中 右键单击项目节点并选择 添加 Service参
  • AWS Fargate - 卷

    我的 docker compose 文件有问题 这是我的 docker 撰写文件 version 3 services nginx proxy image xxxxx dkr ecr xxxxx amazonaws com xxxx lat
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只
  • 2 位小数格式的货币输入

    我需要将输入货币格式化为 2 位小数格式 例如 当用户输入 2 时 它看起来为 2 00 美元 然后当用户输入 2 时 它会转换为 22 00 美元 等等 我采用类似的方法 当用户输入 2 时 它会转换为 0 02 下一个 2 将是这样的
  • Spring Boot 应用程序崩溃

    请告诉我哪里有问题 我尝试启动我的第一个在 Spring Boot 上开发的应用程序 我已经在 SpringMVC 上有了简单的 Web 项目 现在我喜欢在 BOOT 上构建它 这是错误输出 org springframework bean
  • 将流程添加到 create-react-app 项目的编译步骤

    我正在使用 create react app 开发一个项目 并希望将 Flow 添加到我的流程中 这官方文档 https github com facebookincubator create react app blob master p
  • Prolog真的基于封闭世界假设吗?

    在下面封闭世界假设 https en wikipedia org wiki Closed world assumption 目前未知的事实是错误的 Prolog 的语义通常被认为遵循封闭世界假设 例如 here https cstheory
  • System.IO.IOException:进程无法访问文件“.txt”,因为它正在被另一个进程使用

    我正在使用下一个代码来记录 Web 应用程序的错误 using StreamWriter myStream new StreamWriter sLogFilePath true myStream WriteLine string Forma
  • 布尔实现的atomicCAS

    我想弄清楚是否存在错误答案 https stackoverflow com a 57444538 11248508 现已删除 关于Cuda like的实现atomicCAS for bool是 答案中的代码 重新格式化 static inl

随机推荐

  • ASP.NET MVC5 未针对请求的 URL 配置 Web 服务器,并且服务器上未启用目录浏览

    我在从 MVC5 应用程序加载页面时遇到问题 我安装并使用了这个软件 Windows 10 Visual Studio 企业版 2015 微软 IIS 10 0 Express MVC 5 与实体框架 到目前为止 一切正常 我能够显示该网站
  • JSON.parse意外字符错误

    我收到此错误 JSON parse 意外字符 当我在萤火虫中运行此语句时 JSON parse balance 0 count 0 time 1323973673061 firstname howard userId 5383 locali
  • 为简单的 WCF 服务启用基本身份验证?

    我有一个非常简单的 WCF Web 服务 客户在自己的 IIS 上托管该服务 客户有自己的客户端 他们一直在测试环境中对其进行测试 一切都工作正常 直到他们禁用匿名身份验证并启用基本身份验证 一旦他们这样做了 他们就开始出现错误 The a
  • Firestore 时间戳获取 null

    我在我的 android 项目中使用 firestore 一切正常 但是昨天从文档快照获取时间戳值时出现了问题 if documentChange getType DocumentChange Type ADDED Map
  • 自动生成命令以在工作区中重现对象[重复]

    这个问题在这里已经有答案了 假设工作区中已经定义了一个对象 a lt round rnorm 10 1 0 1 1 1 1 0 2 1 1 1 如何以编程方式生成一个命令来创建a 例如 我想使用a在我的工作区中生成以下字符串codeToCr
  • 防止双重表单提交[重复]

    这个问题在这里已经有答案了 精确复制 如何在服务器端处理多个提交 当前的一般任务 防止在多用户基于 Web 的应用程序中提交双重表单 想想金融交易 我有两种可以同时使用的方法 JavaScript disabling of button 缺
  • 是否可以在 JavaScript 中包含 HTML 代码?

    我有一个基本问题 我可以在 JS 中包含 HTML 代码吗 和document write 这是我的 HTML 代码 li a href class menulink text a li li a href class menulink t
  • 如何使用 Javascript 或 jQuery 突出显示页面上所有出现的单词?

    我有一个关键字列表 然后是页面上包含这些关键字的句子列表 我想让关键字列表可点击 当用户单击关键字时 该关键字的所有出现都会在句子中突出显示 我如何使用 jQuery 或原始 Javascript 来做到这一点 我能想到的唯一方法是用一个包
  • Windows 7 SWT 表选定行突出显示颜色

    有没有办法在 Windows 7 的 Aero 主题中设置 SWT 表 FULL SELECTION 样式 突出显示行的背景颜色 它似乎是从表格背景颜色派生出来的 较浅的颜色 但除此之外 我似乎对使用什么颜色没有太多控制权 这对我们来说是一
  • 节点:使用 crypto.randomBytes 生成 6 位随机数

    从中生成精确值的正确方法是什么0 to 999999随机地从1000000不是2的幂吗 这是我的方法 use crypto randomBytes生成 3 个字节并转换为hex 使用前 5 个字符转换为整数 最大值为fffff 104857
  • 如何缩小TFS数据库大小

    我们有一个TFS2010环境 长期以来 其规模每周都在增长 我们删除了很多旧的分支和团队项目 我们还在几个项目中使用了测试附件清理器 就像 Brian Harry 在他的帖子中所说的那样 http blogs msdn com b bhar
  • 在 MySQL 中重置 AUTO_INCRMENT 需要很长时间

    ALTER TABLE tablename AUTO INCREMENT 10000000 此查询需要很长时间才能更新 为什么 我需要优化这个查询 ALTER TABLE 会导致整个表的重建 如果您的表包含许多行 这可能需要很长时间 如果您
  • rubyGems 环境中的“用户安装目录”是什么

    这是我的 RubyGems 环境 红宝石版本 2 5 2 Ruby 版本 2 2 2 2015 04 13 补丁级别 95 x86 64 darwin14 安装目录 Users wh026399 rvm gems ruby 2 2 2 用户
  • 表单的 InvokeRequired == false 和包含控件的 InvokeRequired == true

    这怎么可能 我有 Windows 窗体控件 派生自 System Windows Forms Form 该窗体中包含 WebBrowser 控件 Webbrowser 对象实例是在表单的构造函数中创建的 在 InitializeCompon
  • 使用 Firebase App Check 不起作用(调试)

    在实施 Firebase 的新应用程序检查功能时 我无法解决此问题 将文件上传到 Firebase 存储时失败并出现错误 引起原因 java io IOException 错误 代码 401 消息 Firebase应用程序检查令牌无效 我已
  • Laravel 查询生成器 WHERE NOT IN

    我有以下 sql 查询 SELECT FROM exams WHERE exams id NOT IN SELECT examId FROM testresults 如何将其转换为 Laravel 查询生成器格式 Thanks 您可以使用w
  • node.js require() 缓存 - 可能无效吗?

    来自node js文档 模块在第一次加载后会被缓存 这意味着 除其他外 每次调用 require foo 将得到完全相同的返回对象 如果它解析为同一个文件 有没有办法让这个缓存失效 即对于单元测试 我希望每个测试都在一个新的对象上进行 即使
  • C++ unordered_set 向量

    我可以在 C 中创建向量的 unordered set 吗 像这样的东西 std unordered set
  • 如果没有参数,则针对标准输入运行的脚本;否则输入文件=ARGV[0]

    这工作得很好 只是想知道是否有任何改进可以缩短它 if ARGV 0 nil then input lt else input File new ARGV 0 r end Do something with the input here f
  • 如何建立关系模型(类似 GitHub)权限?

    tl dr 我如何实现像 例如 github 的权限模型 更新以尝试解决 philipxy 的一些评论 我计划实现一个类似于 github 的权限模型 users 用户可以分组 用户可以在组织中 团体可以在组织中 a user will b