这个问题有两种常见的方法,都涉及将允许的操作分解为您可以命名的离散操作. (删除帖子,创建画廊,升级代码,转储数据库,发射导弹,打开车库门.)在bitvector中给每个这样的位图(如果你想要少于32个权限,这是一个很好的和紧凑的存储机制;如果你认为它将超过32个权限,一个典型整数的大小,那么可能是数据库中的一个表..)
因此,您可以直接将用户映射到权限(“我想将gallery_create授予sarnold”),或者您可以通过用户类映射用户和权限(“我想将gallery_create授予art_curator类的所有成员;然后我希望从docent到art_curator推广用户sarnold“).
如果您直接将用户映射到权限,您可能会在部署年后发现一些奇怪的权限.如果您将用户映射到类,您可能会发现自己使用了人为的用户类,因为您信任某个具有特权的特定人员,而不是其他特权.
找出解决这种映射的最佳方法仍然是一个悬而未决的问题;我已经写过不同类型的权限模型Modelling a permissions system可能太多或者信息太少,这取决于您希望系统变得多么复杂.
如果您只想在位图中存储权限(例如,Linux内核为CAP_SYS_ADMIN,CAP_DAC_OVERRIDE等实现CAPABLE()),那么您可以添加一些非常简单的新权限:
if (requested_new_permission == "CAP_SYS_ADMIN")
user->permissions |= CAP_SYS_ADMIN;
else if (requested_new_permissions == "CAP_DAC_OVERRIDE")
user->permissions |= CAP_DAC_OVERRIDE;
…
然后,当您需要测试功能时:
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
并且宏CAPABLE()可以看起来像:
#define CAPABLE(用户,上限)((用户) – >权限&(上限))
(原谅C,我只是不太了解php;我被迫修复了太多的php错误,想要自己学习它.)
如果要通过用户类将用户映射到权限,则可能是三个表:users表,组或类表以及权限表. classes具有user_id和permission_id的列.当您需要检查是否可以授予权限时,请选择用户的类,然后在类中选择权限. (自从我手写SQL以来已经好几年了;我确信单个查询可以给你一个是或否答案,但我不确定它是多表连接还是使用子查询或者它是否是只会更容易对数据库进行两次查询.:)
希望这可以帮助.