我正在尝试按照Yii网站上的教程*在我的项目中实施RBAC。但是,当我尝试按组实现权限时,我感到很困惑。
对于此示例,我在用户表中添加了group
字段,并定义了两个组user (2)
和admin (1)
。
然后我创建了一个如下所示的控制台命令:
class RbacController extends Controller
{
public function actionInit()
{
$auth = \Yii::$app->authManager;
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
$search = $auth->createPermission('search');
$search->description = 'Search';
$search->ruleName = $rule->name;
$auth->add($search);
$user = $auth->createRole('user');
$user->ruleName = $rule->name;
$auth->add($user);
$admin = $auth->createRole('admin');
$admin->ruleName = $rule->name;
$auth->add($admin);
$auth->addChild($admin, $user);
}
}
我有这个文件:rbac / UserGroupRule.php
class UserGroupRule extends Rule
{
public $name = 'userGroup';
public function execute($user, $item, $params)
{
// return true; // force return to true for test
if(!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->group;
if($item->name === 'search') {
return $group == 1;
}
return false;
}
}
我尝试使用if(\Yii::$app->user->can('search'))
测试权限。
首先,我想知道为什么这里需要控制台命令,因为我无法看到它的使用位置。
execute方法中的$ item参数的值为search
,但教程显示它希望此值为角色类型。
无论我在execute方法中返回什么,它似乎都返回false。
有人可以回答这些问题吗?
答案 0 :(得分:0)
我猜你有一个带有DbManager的authManager?
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
从控制台初始化rbac只需在控制台中使用yii rbac/init
(在正确的项目目录中),然后完成数据库条目(在此之前rbac表应为空)
如果你还没有用
创建表格yii migrate --migrationPath=@yii/rbac/migrations
$ item只是auth权限或角色条目。如果添加了规则,则会为每个条目调用该规则。在您的情况下,允许“搜索”和角色“用户”和“管理员”执行规则。
您添加了规则检查条目。所以,如果你是检查用户是否可以通过例如“搜索”来搜索。
if (\Yii::$app->user->can('search')) {
// can search
}
然后检查或执行规则(这是您的UserGroupRule)。在您的情况下,它会返回true
的{{1}}和admins
字段给出的false
的{{1}}。
编辑: 我希望您已将其添加到配置文件中的组件中。
user
您已在rbac(用户/管理员)中创建了2个角色,据我所知,您正在使用User表中的组列将这些角色分配给用户。在您的代码中,您需要检查权限或角色。因此,从DB中选择正确的条目,如果附加了规则,则执行该规则。这将检查当前用户组并返回true或false。因此,在您的情况下,不会对这些角色或权限进行任何分配。它使用规则返回true或false,具体取决于用户组。但是这里有其他扩展搜索yii2admin或yii2rbac,您还可以通过数据库条目将用户分配给角色/权限等。
我会说你应该在可以“聊天”的地方获得更多帮助,例如在yii主页上链接的yii聊天。