我正在关注Yii 2.0的权威指南。在我的应用程序中,我有两个角色:管理员,谁可以做任何事情和观众,谁可以做一些未注册用户不能做的行动。我正在尝试使用Yii 2 RBAC的默认角色功能,但它似乎不起作用。我的数据库中的用户表有一个名为“role”的列:对于admin,它的值设置为1,而对于viewers = 2。
我做了什么:
/app/rbac/UserGroupRule.php
namespace app\rbac;
use Yii;
use yii\rbac\Rule;
class UserGroupRule extends Rule {
public $name = 'userGroup';
public function execute($user, $item, $params) {
if (!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->role;
if ($item->name === 'admin') {
return $group == 1;
} elseif ($item->name === 'viewer') {
return $group == 1 || $group == 2;
}
}
return false;
}
}
$auth = Yii::$app->authManager;
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
$author = $auth->createRole('viewer');
$author->ruleName = $rule->name;
$auth->add($viewer);
$admin = $auth->createRole('admin');
$admin->ruleName = $rule->name;
$auth->add($admin);
$auth->addChild($admin, $viewer);
在我的控制器中:
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['admin'],
'rules' => [
[
'allow' => true,
'actions' => ['admin'],
'roles' => ['admin'],
],
],
],
];
}
当我尝试访问“admin”操作时,它会显示Forbidden#403,即使我是管理员也是如此。如何使它工作?
答案 0 :(得分:3)
我的数据库中的用户表有一个名为&#34的列;角色":对于admin,它的值设置为1,对于viewers = 2
不幸的是,它不是如何运作的。
用户拥有的权限/角色(默认情况下)通过auth_assignment
- 表完成。
只需在其中添加一个条目:
INSERT INTO `auth_assignment` VALUES ("admin", <user-id>, NOW());
(务必将用户ID更改为您想要管理的任何用户。
那应该可以解决你的问题。
编辑(因为我误读了你的一些问题):
根据this link,您确实可以定义默认角色,但您必须确保在配置文件中重新配置authManager
- 组件以包含默认角色:
'components' => [
'authManager' => [
// ...
'defaultRoles' => ['admin', 'viewer'],
],
],
此角色列表指示始终应为每个用户检查的权限,无论他们是否在auth_assignment
- 表中都有条目。
答案 1 :(得分:3)
我在与op面临同样的问题。最后在修补xdebug一段时间后才开始工作。
我觉得关于default roles的官方文档遗漏了几个重点,我将在下面总结一下我的一些个人经历。项目结构基于Yii 2.0高级项目模板
user
表包含id
和group
。 group
类型为int
,admin
为1,author
为2
简化了代码。
规则类,您可以在其中放置实际的规则逻辑。
YII /控制台/控制器/ UserGroupRule.php
namespace app\rbac;
use Yii;
use yii\rbac\Rule;
/**
* Checks if user group matches
*/
class UserGroupRule extends Rule
{
public $name = 'userGroup';
public function execute($user, $item, $params)
{
if (!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->group;
if ($item->name === 'admin') {
return $group == 1;
} elseif ($item->name === 'author') {
return $group == 1 || $group == 2;
}
}
return false;
}
}
现在定义角色..
YII /控制台/控制器/ RbacController.php
namespace console\controllers;
use Yii;
use yii\console\Controller;
class RbacController extends Controller
{
public function actionInit()
{
$auth = Yii::$app->authManager;
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
$admin = $auth->createRole('admin');
$admin->ruleName = $rule->name;
$auth->add($admin);
// define 'author' here...
}
}
准备好此文件后,您应该能够运行./yii rbac/init
来生成规则文件:
console/rbac/items.php
console/rbac/rules.php
重要提示:您需要将生成的文件放在所需的应用程序文件夹下,这一点至关重要。其他明智的Yii 2.0将无法接受规则。例如: yii/backend/rbac/
这与文档
大致相同YII /黎民/配置/ main.php
将以下内容添加到返回数组中:
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'defaultRoles' => ['admin', 'author'], // your define roles
],
现在是有趣的部分,在控制器类下你想要应用规则
YII /后端/控制器/ SiteController.php
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => [], // applies to all actions
'roles' => ['admin'], // your defined roles
],
],
],
到目前为止,规则应该有效。在您的控制器类下,仔细检查Yii::$app->getAuthManager()
,看它是否包含您定义的角色。如果没有,这意味着Yii没有正确地接受规则,请再次检查前面的步骤。