基于角色的访问控制-我应该有权限列表在数据库以及或只是在代码(如enum)



通常在实现某种基于角色的访问控制时,我们有以下众所周知的概念:

  • 用户

用户将被分配到角色,每个角色都有一组权限(执行操作/访问资源等)。因此,用户通过被分配给一个或多个角色(这些角色已经被分配了一组权限)来获得执行操作的权限。

在任何给定的应用程序中,权限都是在编译时定义的,因为代码实际上在访问资源的各个地方强制执行权限。

我的想法是,如果可能的权限/操作集发生变化-它需要更改代码和重新编译任何方式,所以在数据库中有一个查找/引用表将不会真正提供任何价值,除了db管理员可以做一个快速的sql查询来列出应用程序使用的所有权限。

然而,我见过的大多数应用程序都为权限创建了一个查找表,并将其映射到代码中的enum。

考虑到这一点,是否有任何理由实际上有一个数据库表表示可能的权限列表(除了事实,它可能更容易在数据库中查找,而不是挖掘到代码中找到权限列表/枚举)?

清单:1)您是否需要在网站在线时进行更改,而不会停机?2)您将使用内置的角色/会员提供程序吗?3)你想使用属性(如mvc[授权])等?4)您希望允许用户以编程方式更改权限/角色?

以上任何一种都意味着你必须将信息存储在数据库上。

对于较小规模的应用程序,我更喜欢创建一些静态方法,也使用某种继承,例如:

 isadmin()
 {
     if (usernameArray.Contains[currentname]) 
         return true;
     [...]
 }
 ispublisher()
 {
    if (isadmin()) return true;
     [...]
  }

和一个表的权限为每个用户伪类。

Update: DB schema for specific access: (* is key, &是外键)

 Users:
 Username *
 [...]

 UserClasses (EG: admin...)
 ID *
 description
 AccessTypes  (EG: can delete)
 ID *
 description
 UserClassesAssign
 classid *&
 username *&
 AccessPerClass
 accessid *&
 classid *&

所以任何时候你想看看'username'是否能够'CanDelete'你必须检查用户'username'是否链接到任何类链接到访问'CanDelete',这些链接当然可以在运行时改变

最新更新