1

任何人都可以帮忙吗?实体框架:权限,用户等的关系模型帮助

我期待创建一个良好的管理权限的关系模型。

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

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

我将使用EF这些表来决定哪些访问权限的用户和天气显示窗体或没有等

我原来的模式是这样的,但我认为它错了,因为它不到风度声明有关权限的任何信息。

用户 UsersCustomers(包括用户和客户之间的关系) UsersSuppliers(包括用户和供应商之间的关系) 客户(customer表) 供应商(供应商表)。

虽然这有效,即它将用户与客户联系起来,例如......这看起来不对。

我正在考虑放置一个称为Permissions的中间表,它有一个Id和一个UserId来链接用户表。然后,我可以将权限链接到表格,如

PermissionsCustomers(代替UsersCustomers),其中包含persistence和客户之间的关系。

我觉得这个我并没有得到最佳的设计。一旦这种设计是正确的,它也将缺少一个表来分配用户对客户的许可类型,即编辑,创建或仅查看等。

我很想听听一些反馈或强壮的例子存在这种功能的模型。

至于客户,供应商,这些都只是2个例子,会有很多更喜欢deliveryLocation,accountsLedger等表

这将是巨大的,如果我可以做一个查询,说:“给我所有用户X拥有的权限“,目前在我的设置中,我将不得不分别查询每个中间表。

我会通过一个像实体框架的ORM来使用它。

与关系模型的结构有点迷失。

在此先感谢。

+0

您是否真的要维护每个客户和每个供应商的权限?换句话说,如果用户拥有300个客户和100个供应商的权限,那么权限表中是否会有400行?这似乎是非常难以设置和维护。是不是有其他的方式(即这个用户可以编辑俄亥俄州的所有客户,或销售额> 100万美元等的客户)。 –

+0

HI Ej,是的非常真实,但系统将包含只有15个客户(其定制系统)和5个供应商..不会有那么多..我需要真正有权给予用户可以用客户/供应商做某件事情。 – Martin

回答

2

鉴于您的客户和供应商数量非常少(共20个),因此您不需要非常复杂的系统。

我在类似情况下所做的是有这样一个结构的权限表设置:

  • 用户ID(用户ID)
  • 角色ID(链接到一个角色表中的ID,用诸如“编辑客户”,“删除供应商”等,查看客户 等)
  • 的ObjectId(这将是标识无论要保护 对象的ID,因此无论是供应商ID或用户ID)

角色表将有:

  • 标识(唯一的ID涉及角色ID的权限表)
  • 名称(角色的唯一名称,即“编辑客户”)

然后,每个用户实体都链接到一个权限表,每个用户都有多个权限。当用户登录时,我通常会选择将其所有权限加载到内存列表中,以便用户拥有权限列表。权限列表将刚才的的ObjectId和角色名和/或角色ID(我倾向于使用角色名,以使代码更易于阅读,你可以在下面的例子看到)

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; 

} 

然后,如果我想要知道,如果一个用户的权限东西,我会做到这一点:

if (myUser.HasPermission(CustomerId, "Edit Customer") { 
    //allow the user to edit the customer 
else 
    //allow the user to only view the customer (for example) 

if (myUser.HasPermission(SupplierId, "Print Supplier") { 
    //allow the user to print the record 
else 
    //give user a warning 

的关键是,每个“角色”需要是唯一的,你不能有一个通用的'编辑'角色,因为如果你有一个具有相同ID的客户和供应商,并且您想要查看该用户是否具有“编辑”权限,则可能会得到错误的结果。所以有一个叫'编辑客户'的角色和另一个叫'编辑供应商'的角色。

该解决方案不能很好地扩展imo,但对于只有数十个需要保护的记录的数据库来说,它工作得很好,并且易于实现和维护。它也没有以真正的关系方式进行设置,即权限表中的ObjectId与供应商或客户表无关。 (此外,在这种情况下,我的用户对象知道它是否是管理员,管理员不需要权限设置,可以访问所有内容,因此不需要权限搜索 - 可以节省几纳秒的时间)

+0

“这个解决方案不能很好地扩展”:你有一个类似的模型可以很好地扩展吗?也许拥有项目组的权限或比其他角色更大的角色? – sports