A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


在读这篇文章之前你首先应该学习 How to setup RBAC with a php file

它实际在文档中提到

CPhpAuthManager :CPhpAuthManager 适用于数据不是太大的授权(例如:个人博客系统的授权)。当系统的授权数据比较复杂的时候应当使用 CDbAuthManager.

你可能会错误地认为它是完美的并可以允许你管理下一个百万用户的网站角色.但有许多方法来实际的改善它,如果你的层次结果简单你就可以使用它服务百万用户。

为什么 CPhpAuthManager 是"邪恶的"?
第一次使用有什么问题? 你设置 auth.php 文件,它有规则 - 没问题.

实际上当你逐渐使用的时候你会发现很多问题.

让我们来先看一下 CPhpAuthManager::assign 方法。从下面这段来开始了解:

$this->_assignments[$userId][$itemName]
向某个用户分配角色,它将添加到现有的分配(assignments),用户 ID 作为键。我们可以使用一下方法来检查是否分配:

isset($this->_assignments[$userId][$itemName])
现在你看到的代码中没有 session,所以如果你没有保存,用户下一次访问其他页面的时候将会没有角色.

所以你应该在角色分配或撤销的 最后 保存(循环的最后,不是中间).

CPhpAuthManager::save 方法将所有分配的角色数据保存到 auth.php.

还记得刚才的问题吗?

$this->_assignments[$userId][$itemName]
就像你看到的 auth.php 将会被覆盖,并且每个用户Id都将会被添加一次角色.假如你有 10000 个用户,你将会有 10000+ 行在 auth.php 文件中,并且每次都加载它们。

如果你有 100000 用户 程序就会死掉了...

因为它 每次 都被覆盖!!!

解决方法?
就像文档中提到的那样,如果你没有几个良好的策略,最好不要在多余几百用户的项目上使用 CPhpAuthManager。

但是当你的层次很简单,如下:

禁止,嘉宾,用户,版主,管理员

大多数 网站都是这样

您可以按照本规则,并轻松地处理一百万用户

规则
当不删除用户或修改行时从不 撤销角色
只有当版主或管理员分配了用户角色时才分配角色并执行 CPhpAuthManager::save 方法
从 不在 accessControl 中使用
'roles'=>array('user')
假如你的用户表中有角色字段

被禁止的规则将取代您原来的授权,没必要这么做,只需禁止未登录的用户

怎么使用 @ 来替换 'roles'=>array('user') 方式

'users' => array('@')
对于

'roles'=>array('someROle')
只 对版主和管理员使用

结论
如果你遵循这个规则,如果你用一百万用户,你大致会有100个版主和几个管理员对于 CPhpAuthManager 这只是小意思.

你只需要记住每一个角色的分配都将向 auth.php 文件添加行,并每次都会加载它.

1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马