PHP前端数据库功能类似于Windows中的文件权限

时间:2012-07-11 12:28:41

标签: php mysql pdo file-permissions

我正在尝试在我的数据库中实现一个表行权限系统(使用PHP前端和MySQL后端)。它应该遵循Windows文件权限系统,意思是:

  • 有用户
  • 每个用户可以是多个组的成员
  • 每个组都可以是其他超级组的成员
  • 您可以指定整个组,超级组或单个用户 权限
  • 应该是:用户权限取代子组取代超级组。 (< - 并非完全必要)

用户在创建数据库条目后,可以指定哪些组/用户应具有哪些权限(读取,写入或保持不可见)。访问Web前端时,只应显示其拥有权限的条目(使用cookie登录系统)。只有那些他们具有写权限的人才可以进行编辑。

基本上,我不知道如何有效地创建数据库以将用户与他们应该拥有的权限相关联(我知道,一旦我获得了权限“级别”,当然如何做其余的事情)

我已经尝试过关系表,但这很复杂。我在文件条目本身(作为文件的一个字段)尝试了用户/组ID的数组,但这很草率,只支持64个条目(以及难以实现组/用户的heirarchies)。

是否有任何示例,插件,有什么可以帮助解决这个问题?我精通Javascript,PHP,SQL,HTML及其关系,我正在使用新的PDO扩展重写旧版本。我知道这是可能性的,但我尝试过的每一次战斗都只是一场噩梦。

1 个答案:

答案 0 :(得分:2)

如果您使用的是Oracle,则可以使用角色功能来处理组的层次结构。 Mysql目前不提供此功能(虽然它似乎在列表中here)。

与此同时,你可以模仿这样的功能。
创建一个名为roles的表,其中包含id和name字段,并填充一组角色。

enter image description here

创建一个名为user_role_privs的表,该表将保存用户与角色的直接链接。

enter image description here

并创建一个名为role_role_privs的表,其中包含授予其他角色的角色

enter image description here

最后,我们添加了一个只能通过某些权限访问的表,因此我们添加了我们想要的列加一个可以查看此数据的角色。

enter image description here

然后我们创建一个新视图,它使用角色表中的数据和current_user()函数来确定可以显示哪些数据。

create or replace view user_student 
    as select s.id, s.name, s.age
        from user_role_privs urp, student s 
       where urp.user=current_user() 
         and urp.role=s.role
       union 
      select s.id, s.name, s.age
        from user_role_privs urp, role_role_privs rrp, student s
       where urp.user=current_user()
         and urp.role=rrp.role_id
         and rrp.granted_role=s.role

现在,如果你的php允许user1登录,他们将从视图中选择并查看以下数据 - 即冥王星是基于直接角色授予和米奇和唐纳德看到的,因为职员的角色被授予角色管理器。

但是如果user2登录,他们只会看到直接授予他们的职员角色的记录,这些记录是米奇和唐纳德。

因此,如果您的应用程序从user_student角色而不是student表中选择数据,那么它将提供读访问权。

要根据角色进行写入访问,您可能需要扩展此想法以在角色表中包含编辑标志,并且仅在角色允许时显示编辑按钮和相关功能。

角色应该有权编辑它可以看到的任何数据,因此如果需要,可以通过创建更多角色来保持代码更简单。对于插入表中,您可能还需要一个before insert触发器,以插入在student.role列中创建它的用户的角色。你必须决定这是否应该是具有最高或最低权限的角色,因此这也授予其他用户访问权。