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

时间:2011-08-14 11:55:26

标签: c# entity-framework orm relational-database database-permissions

有人可以帮忙吗?

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

我目前有一个Users表,以及其他各种表,例如Customers,Suppliers。

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

我将在EF中使用这些表来决定用户具有哪些访问权限以及天气以显示表单等。

我的原始模型是这样的,虽然我认为它是错的,因为它没有说明任何关于权限。

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

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

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

这样的表

PermissionsCustomers(代替UsersCustomers),它们包含persmission和customers之间的关系。

我认为这是我没有得到最佳设计的地方。一旦这个设计正确,它也会缺少一个表来分配用户对客户的权限类型,即编辑,创建或仅查看等。

我很想听到一些反馈或一个存在功能如此强大的模型的例子。

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

如果我可以执行一个查询“显示用户X拥有的所有权限”,那将是很好的,目前使用我的设置我将不得不分别查询每个中间表。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

鉴于您将拥有极少数客户和供应商(总共20个),您不需要非常复杂的系统。

我在类似情况下所做的是拥有一个权限表设置,其结构如下:

  • UserId(用户ID)
  • RoleId(链接到角色表的ID,包含“编辑客户”,“删除供应商”等内容,查看客户 等)
  • ObjectId(这将是识别任何内容的id 您要保护的对象,因此要么是供应商ID,要么是客户ID。)

角色表将包含:

  • Id(唯一ID与权限表中的RoleId相关)
  • 名称(角色的唯一名称,即“编辑客户”)

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

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,并且您想查看是否用户有权“编辑”,您可能会得到错误的结果。因此,有一个名为“编辑客户”的角色和另一个名为“编辑供应商”的角色。

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

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