[color="#FF0000"][size="7"]已测试成功,下楼说明情况.[/size][/color]
设定:
一个yii应用程序中,需要有不用的应用,如:交友/论坛/新闻 等应用.
需求:
每个应用中需要有不同的用户组或角色来区分权限.如下:
交友:
初级用户(可以查看其他会员的页面,但隐藏联系方式)
VIP会员 (可以通过"查看"按钮来付费或扣除一点点数来查看单独一个会员的联系方式)
贵宾 (默认即可显示出联系方式)
论坛:
初来咋到(可以查看)
新人 (可以回复)
住户 (可以发主题帖)
管理员(分组别)
新闻:
......
数据表:
表一:模块表(存储要开通的模块,如:论坛,交友,新闻等)
表二:角色与模块关联表(用于给用户授权某个模块时,拉取可授权的角色列表)
表三:授权表(存储授权关系,如:关联至哪个应用,哪个会员,关联哪个角色,其他,角色由表二来过滤)
实现方法:
借助Yii的Rbac中,商务规则来实现,可参考:
《应用Yii1.1和PHP5进行敏捷Web开发》第八章:迭代5:用户访问控制 yiibook.com/chapter-8/
通过配置app的config,来给用户默认拥有他可能拥有的角色.
角色的商务规则中,存在两个条件:
条件一: 表二中是否有本模块与本会员的关联记录
条件二: 表二中针对个人授权的角色,是否与本角色是同一个
即:
‘components‘ => array(
//……
‘authManager‘=>array(
‘class‘=>‘CDbAuthManager‘,//认证类名称
[color="#FF0000"]‘defaultRoles‘=>array(‘guest‘,....(更多的角色)....),//默认角色(这个是重点[/color]
‘itemTable‘ => ‘pre_auth_item‘,//认证项表名称
‘itemChildTable‘ => ‘pre_auth_item_child‘,//认证项父子关系
‘assignmentTable‘ => ‘pre_auth_assignment‘,//认证项赋权关系
),
//……
添加角色时,
$bizRule='return 当前应用ID==当前用户授权表中有这个角色 and 当前角色名==当前用户授权表中有的角色名';
验证:
参数=([color="#0000FF"]本角色ID==授权表中的角色集合[/color])及 当(前模块是否有授权)
Yii::app()->user->checkAccess('某操作',参数)
除了 本角色ID==授权表中的角色集合 这个地方有点想不通怎么处理.
除却这个,理论上这个方法好像可靠.请大家来讨论一下.