1

任何人都可以帮忙吗?

我正在寻找一个好的关系模型来管理权限。

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

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

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

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

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

尽管这可行,例如,它将用户与客户联系起来......它似乎并不正确。

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

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

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

我很想听听一些反馈或一个存在这样功能的强大模型的示例。

关于客户、供应商,这只是 2 个示例,还会有更多的表,例如 deliveryLocation、accountsLedger 等。

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

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

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

提前致谢。

4

1 回答 1

3

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

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

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

角色表将具有:

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

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

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 与供应商或客户表都不相关。

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

于 2011-08-14T13:35:00.463 回答