我有一个ASP.net网站,后端有MS SQL Server。
为简单起见,我将用三个四个表来描述我的问题,但实际上它远不止于此。
TABLES:
tblSYSTEMS
•SystemID(PK)
•SystemDescription
•其他专栏
tblSYSTEMS_Projects(许多项目可以与每个系统相关联)
•用户可以根据权限查看/修改/删除的各个字段。
USERS(由ASP.net生成,用户/会员/角色等...)
•用户ID
•其他专栏
tblSYSTEMS_PERMISSIONS_LINK(此链接两个表格)
•SystemID
•用户ID
•AllowEdit
•AllowView
•AllowDelete
•AllowInsert
我为数据库中的tblSYSTEMS_Projects的每个INSERT / UPDATE / DELETE函数设置了一个存储过程。
当用户在tblSYSTEMS_Projects中更改/添加/删除记录时,我会将@userid的参数(从当前登录的用户)发送到SP。
对于UPDATE,我检查tblSYSTEMS_PERMISSIONS_LINK,对于tblSYSTEMS中的给定系统,他们将AllowEdit设置为true。表链接的方式,如果它们没有EDIT权限,则不会更新行(因为WHERE子句本质上返回0行),这是我在执行SP时得到的。细
DELETE也一样。
但对于INSERT,没有WHERE子句可用于将记录INSERTING到tblSYSTEMS_Projects。
我查看了角色/成员资格等...但这并不常用,因为许多不同的人拥有基于SYSTEM的不同权限。在一个系统中,一个人可以是ADMIN,而另一个系统只能是一个查看器。
我想要完成的是让用户只能访问他们的记录,但只授予他们执行他们允许的操作的权限。但这些权限因SystemID而异。
答案 0 :(得分:0)
有很多方法可以做到。这是我的方法基于角色的授权 -
我将根据用户的角色限制授权。例如,如果系统位于 AddRole 且用户位于 AddRole ,则用户可以创建新记录。
页面的授权逻辑不应仅在存储过程中。相反,它应该在表示层(例如Controller)中启动。
如果您需要额外的逻辑检查,可以将其置于业务逻辑层。
tblSYSTEMS_PERMISSIONS_LINK (this links the two tables)
• SystemID
• userid
• AllowEdit
• AllowView
• AllowDelete
• AllowInsert
您不应该使用单个列创建 tblSYSTEMS_PERMISSIONS_LINK 表。 这不是一个好的数据库设计,除非您可以100%确保将来不会有任何新的授权类型。