基于信誉实现权限
我正在创build一个网站,其中有每个用户或用户组的项目,用户和权限。 这是一个社区协作工具,我有4个不同的权限:
- 创作者 – 进行更改,接受更改,更改权限
- 接受更改
- 做出改变
- 视图
我怎么能在数据库中实现这种权限系统,供用户组使用?
编辑:组/权限是由声誉定义,就像在StackOverflow。
编辑2 – 更多细节:每个文件需要有权限,项目需要默认权限为新创build的文件,我还需要设置MySQL数据库权限。
user_table id, etc permission table id, user_id, permission_type
通过这种结构,每个用户可以拥有多个与他们的账户相关联的权限types,每个权限types可以访问每个权限types。 您将永远不需要更改表结构以添加新的types的权限。
为了更进一步,您可以使每种types的许可都是二进制数字。 这样你可以通过使用按位运算符使一组权限由一个整数表示。
例如,如果你有常量
PERMISSION_CHANGE_PERMISSIONS = bindec('001') = 1 PERMISSION_MAKE_CHANGES = bindec('010') = 2 PERMISSION_ACCEPT_CHANGES = bindec('100') = 4
您可以使用按位运算符“|”将这些值合并为一个整数
(PERMISSION_CHANGE_PERMISSIONS | PERMISSION_MAKE_CHANGES) = bindec('011') = 3 = $users_combined_permissions
然后检查他们是否有特定的权限,使用按位运算符“&”
($users_combined_permissions & PERMISSION_MAKE_CHANGES) = true
如果你这样做了,你只需要为每一组权限设置一个数据库logging。
我过去为此使用了Zend_Acl 。 我可以推荐它。 一个久经考验的库,很容易实现,可以单独使用。 如果您之后添加了不同的权限scheme,则此选项可以很好地扩展。
我会创build两个表 用户和行列。
User ----- id username rankID Ranks ------ id makeChanges acceptChanges changePermissions view
然后,只需在Ranks表中创build您想要的各个等级,并将用户的等级ID设置为与您所需的相匹配。 确保在Ranks表中设置每个字段的值为0或1; 与0不具备该能力和1有该选项。
编辑如果你打算在没有数据库的情况下这样做,那么你可以使用PHP5中的类甚至实例来完成。 例如,假设您为原始文章中的每个东西都设置了名称:
Creator - make changes, accept changes, change permissions Reviewer - Accept changes Editor - Make changes Regular - View
那么你可以做下面的事情。 (数据库方式显然是一个更好的方法,但这只是一个例子。)
class Regular { public function View() { //Do the view stuff in here } } class Editor extends Regular implements Edit { } class Reviewer extends Regular implements Review { } interface Review { public function AcceptChanges() { //Do the accept changes here } } interface Edit { public function MakeChanges() { //Do the make changes stuff here } } class Creator extends Regular implements Edit, Review { public function ChangePermissions() { //Do the change permissions stuff here } }