有人可以帮忙吗?
我希望为管理权限创建一个良好的关系模型。
我目前有一个Users表,以及其他各种表,例如Customers,Suppliers。
用户需要在客户,供应商中查看,编辑,创建权限。
我将在EF中使用这些表来决定用户具有哪些访问权限以及天气以显示表单等。
我的原始模型是这样的,虽然我认为它是错的,因为它没有说明任何关于权限。
用户 UsersCustomers(包含用户和客户之间的关系) UsersSuppliers(包含用户和供应商之间的关系) 客户(客户表) 供应商(供应商表)。
虽然这有效,但它将用户与客户联系起来......例如......这似乎不对。
我正在考虑放置一个名为Permissions的中间表,它会有一个Id和一个UserId来链接用户表。然后我可以将权限链接到像
这样的表PermissionsCustomers(代替UsersCustomers),它们包含persmission和customers之间的关系。
我认为这是我没有得到最佳设计的地方。一旦这个设计正确,它也会缺少一个表来分配用户对客户的权限类型,即编辑,创建或仅查看等。
我很想听到一些反馈或一个存在功能如此强大的模型的例子。
关于客户,供应商,这些只是两个例子,会有更多的表,如deliveryLocation,accountsLedger等。
如果我可以执行一个查询“显示用户X拥有的所有权限”,那将是很好的,目前使用我的设置我将不得不分别查询每个中间表。
我将通过类似ORM的实体框架来使用它。
关系模型的结构有点迷失。
提前致谢。
答案 0 :(得分:2)
鉴于您将拥有极少数客户和供应商(总共20个),您不需要非常复杂的系统。
我在类似情况下所做的是拥有一个权限表设置,其结构如下:
角色表将包含:
然后每个用户实体都链接到一个权限表,每个用户都有多个权限。当用户登录时,我通常会选择将所有权限加载到内存列表中,因此用户将拥有权限列表。权限列表只包含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与供应商或客户表无关。
(另外,在这种情况下,我的用户对象知道它是否是管理员,管理员不需要权限设置,可以访问所有内容,因此不需要权限搜索 - 节省几纳秒的时间)