我正在创建自定义摄影CMS系统,需要实现用户身份验证和权限系统。业界通常采用哪种方法来创建这种模式。
基本上我需要有用户,用户可以是不同类型的。有些用户可以说只能创建画廊,其他用户只能编辑它们,或者只编辑某些画廊等等。那么应该如何构建它。我正在使用MySQL数据库,我正在使用PHP来编写CMS。
我试着在Google上查找但是只找到了解释如何为实际MySQL数据库创建用户的文章。我将欣赏一篇文章的链接,该文章解释了应该如何完成这类工作。
提前谢谢。
答案 0 :(得分:5)
这个问题有两种常见的方法,都涉及将允许的操作分解为您可以命名的离散操作。 (删除帖子,创建画廊,升级代码,转储数据库,发射导弹,打开车库门。)在bitvector中给每个这样的位图(如果你想要少于32个权限,这是一个很好的和紧凑的存储机制;如果你认为它将超过32个权限,一个典型整数的大小,那么可能是数据库中的一个表..)
因此,您可以直接将用户映射到权限(“我想将gallery_create
授予sarnold
”),也可以通过用户类映射用户和权限(“我想授予{ {1}} gallery_create
类的所有成员{1}};然后我希望将用户art_curator
从sarnold
推广到docent
“。
如果您直接将用户映射到权限,您可能会在部署年后发现一些奇怪的权限。如果您将用户映射到类,您可能会发现自己处于人为类别的用户,因为您信任某个具有特权的特定人员,而不是其他特权。
找出解决这种映射的最佳方法仍然是一个悬而未决的问题;我写了不同类型的权限模型Modelling a permissions system,这些模型可能过多或信息太少,具体取决于您希望系统变得多么复杂。
如果您只想在位图中存储权限(例如,Linux内核的art_curator
CAPABLE()
,CAP_SYS_ADMIN
等的实现),那么您可以添加新权限非常简单的事情:
CAP_DAC_OVERRIDE
...
然后当您需要测试功能时:
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();
可能如下所示:
#define CAPABLE(用户,上限)((用户) - >权限&(上限))
(原谅C,我只是不太了解php;我被迫修复了太多的php错误,想要自己学习它。)
如果要通过用户类将用户映射到权限,则可能是三个表:CAPABLE()
表,users
或groups
表,以及{{1} }表。 classes
包含permissions
和classes
的列。当您需要检查是否可以授予权限时,请选择用户的类,然后在类中选择权限。 (自从我手写SQL以来已经好几年了;我确定单个查询可以给你一个是或否答案,但我不确定它是多表连接还是使用子查询或者它是否是只会更容易对数据库进行两次查询。:)
希望这有帮助。