首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架:权限、用户等的关系模型帮助

实体框架:权限、用户等的关系模型帮助
EN

Stack Overflow用户
提问于 2011-08-14 19:55:26
回答 1查看 1.6K关注 0票数 1

有人能帮上忙吗?

我希望创建一个良好的关系模型来管理权限。

我目前有一个用户表,以及各种其他表,如客户,供应商。

用户需要拥有在客户或供应商中查看、编辑、创建的权限。

我将在EF中使用这些表来决定用户拥有什么访问权限,以及天气是否显示表单等。

我最初的模型是这样的,尽管我认为这是错误的,因为它没有说明任何关于权限的内容。

Users UsersCustomers (包含用户与客户的关系) UsersSuppliers (包含用户与供应商的关系) Customers (客户表) Suppliers (供应商表)。

尽管这是可行的,例如,它将用户与客户联系在一起。这看起来不太对劲。

我在考虑放一个名为Permissions的中间表,它将有一个Id和一个链接user表的UserId。然后,我可以将权限链接到如下所示的表

包含权限和客户之间关系的PermissionsCustomers (代替UsersCustomers)。

我想这是我没有得到最优设计的地方。一旦这种设计是正确的,它还将缺少一个表来分配用户对客户拥有的权限类型,即编辑、创建或仅查看等。

我很乐意听到一些反馈或一个强大的模型的例子,它的功能是这样的。

关于客户,供应商,这些只是两个例子,还会有更多的表格,如deliveryLocation,accountsLedger等。

如果我可以做一个查询,说“显示用户X拥有的所有权限”,那就太好了,目前使用我的设置,我必须分别查询每个中间表。

我将通过一个类似于ORM的实体框架来使用它。

对关系模型的结构有点迷惑。

提前谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2011-08-14 21:35:00

考虑到你的客户和供应商数量非常少(总共20家),你不需要一个非常复杂的系统。

我在类似的情况下所做的就是设置了一个具有如下结构的权限表:

  • UserId (用户id )
  • RoleId (链接到角色表的id,带有诸如“编辑客户”、“删除供应商”、查看客户等内容)
  • ObjectId (这将是标识您要保护的任何对象的id,因此供应商id或客户id。)

角色表将包含:

  • Id (唯一id与权限表中的RoleId相关)
  • name (角色的唯一名称,即‘编辑客户’)

然后将每个用户实体链接到一个权限表,每个用户具有多个权限。当用户登录时,我通常会选择将他们的所有权限加载到内存列表中,这样用户就会有一个权限列表。权限列表将只包含ObjectId、RoleName和/或RoleId (我倾向于使用rolename以使代码更易于阅读,如下面的示例所示)。

代码语言:javascript
运行
复制
protected bool HasPermission(long ObjectId, string RoleName)
{

//Users in the Administrator role have access to everything in the system.
if (this.IsAdministrator) {
    HasPermission = true;
    return;
}

foreach (Permission P in Permissions) {
    if (P.ObjectID == ObjectID & P.RoleName == Role) {
        HasPermission = true;
        return;
    }
}
return false;

}

然后,如果我想知道用户是否有权限访问某事,我会这样做:

代码语言:javascript
运行
复制
if (myUser.HasPermission(CustomerId, "Edit Customer") {
  //allow the user to edit the customer
else
  //allow the user to only view the customer (for example)

代码语言:javascript
运行
复制
    if (myUser.HasPermission(SupplierId, "Print Supplier") {
  //allow the user to print the record
else
  //give user a warning

关键是,每个“角色”需要是唯一的,你不能有一个通用的“编辑”角色,因为如果你有一个拥有相同id的客户和供应商,而你想看看用户是否有“编辑”的权限,你可能会得到错误的结果。因此有一个名为“编辑客户”的角色和另一个名为“编辑供应商”的角色。

这种解决方案不能很好地扩展imo,但对于只有几十条需要保护的记录的数据库来说,它工作得很好,而且易于实现和维护。它也不是以真正的关系方式设置的,即权限表中的ObjectId既不与供应商表也不与客户表相关。

(此外,在这种情况下,我的用户对象知道它是否是管理员,管理员不需要设置权限,可以访问所有内容,因此不需要搜索权限-节省了几纳秒的时间)

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7056661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档