php - 如何构建 cms 的用户权限

标签 php database authentication permissions structure

我正在创建自定义摄影 CMS 系统,需要实现用户身份验证和权限系统。行业中创建此类架构的通常做法是什么。

基本上我需要有用户,用户可以是不同类型的。有些用户可以说只能创建画廊,其他人只能编辑它们,或者只能编辑某些画廊等。那么这应该如何构建。我正在使用 MySQL 数据库,我正在使用 PHP 对 CMS 进行编码。

我尝试在 Google 上查找,但只找到解释如何为实际 MySQL 数据库创建用户的文章。我会很感激一篇文章的链接,该文章解释了应该如何完成这类事情。

提前谢谢你。

最佳答案

有两种常见的方法可以解决这个问题,这两种方法都涉及将允许的操作分解为您可以命名的离散事物。 (删除帖子、创建画廊、升级代码、转储数据库、发射导弹、打开车库门。)在位向量中为每一个提供一个位图(如果你打算拥有少于 32 个权限,这很好和紧凑的存储机制;如果你认为它会增长到超过 32 个权限,一个典型整数的大小,那么可能是你数据库中的一个表..)

因此,您可以直接将用户映射到权限(“我想将 gallery_create 授予 sarnold”),或者您可以通过用户类映射用户和权限( “我想将 gallery_create 授予 art_curator 类的所有成员;然后我希望从 docent 提升用户 sarnold > 到 art_curator")。

如果您直接将用户映射到权限,您可能会在多年后的部署中发现奇怪权限的大杂烩。如果您将用户映射到类别,您可能会发现自己拥有人为的用户类别,因为您相信一个特定的人拥有一种特权,而不是其他特权。

找出解决此映射的最佳方法仍然是一个悬而未决的问题;我写过不同类型的权限模型 Modelling a permissions system这些信息可能太多也可能太少,具体取决于您希望系统变得多么复杂。

如果您只想在位图中存储权限(例如,Linux 内核为 CAP_SYS_ADMINCAP_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(user,cap) ((user)->permissions & (cap))

(请原谅 C,我只是不太了解 php;我被迫修复了太多的 php 错误,以至于不想自己学习。)

如果你想通过用户类将用户映射到权限,那么它可能是三个表:一个users表,一个groupsclasses 表和一个 permissions 表。 classes 包含 user_idpermission_id 列。当您需要检查是否可以授予权限时,选择用户的类别,然后选择类别中的权限。 (自从我手写 SQL 以来也有好几年了;我确信单个查询可以给你一个是或否的答案,但我不确定它是多表连接还是使用子查询,或者它是否对数据库进行两次查询会更容易。:)

希望这对您有所帮助。

关于php - 如何构建 cms 的用户权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4654820/

相关文章:

PHP 包含数据库连接 - 缓存限制器警告

mysql - 对多个元素表示赞同/反对

authentication - 验证测试失败,使用 Laravel、phpunit 和 Homestead

css - 样式 Wordpress 登录小部件

php - 最简单的 ajax (jQuery) 版本,仅上传一个文件

php - 在 Symfony2 中安装新包后无法使用 Netbeans 控制台(错误 : Symfony2 console must be selected)

python - MongoDB 的位置索引在什么单位?米?英里?

mysql 查询导致带有数字符号的空白页?

php session 安全查询

php - MySQL/PHP - 在 INSERT 语句上插入额外的行