RBAC Yii2 不适用于默认角色
RBAC Yii2 doesn't work with default roles
我正在关注 Yii 2.0 权威指南。在我的应用程序中,我有两个角色:管理员,可以做任何事情;查看者,可以执行一些未注册用户无法执行的操作。我正在尝试使用 Yii 2 RBAC 的默认角色功能,但它似乎不起作用。我的数据库中的用户 table 有一个名为 "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,即使我是管理员也是如此。如何让它发挥作用?
The user table in my database has a column named "role": for admin it's value set to 1 and for viewers = 2
不幸的是,这不是它的工作原理。
用户拥有的 rights/roles 是(默认情况下)通过 auth_assignment
-table 完成的。
只需在其中添加一个条目:
INSERT INTO `auth_assignment` VALUES ("admin", <user-id>, NOW());
(请务必将用户 ID 更改为您想要设为管理员的任何用户。
这应该可以解决您的问题。
编辑(因为我误读了你的一些问题):
根据 this link,您确实可以定义默认角色,但您还必须确保在配置文件中重新配置 authManager
-组件以包含默认角色:
'components' => [
'authManager' => [
// ...
'defaultRoles' => ['admin', 'viewer'],
],
],
此角色列表指示始终应为每个用户检查的权限,无论他们是否在 auth_assignment
-table 中有条目。
我遇到了与 op 相同的问题。在修改了一段时间的 xdebug 后终于让它工作了。
我觉得default roles的官方文档遗漏了几个要点,我将在下面结合我的一些个人经验对其进行总结。项目结构基于Yii 2.0 Advanced Project Template
数据库
user
table 包含 id
和 group
。其中 group
是类型 int
,1 表示 admin
,2 表示 author
规则设置
为清楚起见简化了代码。
规则 class,放置实际规则逻辑的地方。
yii/console/controller/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/console/controller/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/commom/config/main.php
将以下内容添加到 return 数组:
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'defaultRoles' => ['admin', 'author'], // your define roles
],
现在是有趣的部分,在控制器下class您想应用规则
yii/backend/controllers/SiteController.php
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => [], // applies to all actions
'roles' => ['admin'], // your defined roles
],
],
],
到目前为止,规则应该有效。在您的控制器 class 下,仔细检查 Yii::$app->getAuthManager()
看看它是否包含您定义的角色。如果不是,则说明 Yii 没有正确选择规则,请再次检查前面的步骤。
我正在关注 Yii 2.0 权威指南。在我的应用程序中,我有两个角色:管理员,可以做任何事情;查看者,可以执行一些未注册用户无法执行的操作。我正在尝试使用 Yii 2 RBAC 的默认角色功能,但它似乎不起作用。我的数据库中的用户 table 有一个名为 "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,即使我是管理员也是如此。如何让它发挥作用?
The user table in my database has a column named "role": for admin it's value set to 1 and for viewers = 2
不幸的是,这不是它的工作原理。
用户拥有的 rights/roles 是(默认情况下)通过 auth_assignment
-table 完成的。
只需在其中添加一个条目:
INSERT INTO `auth_assignment` VALUES ("admin", <user-id>, NOW());
(请务必将用户 ID 更改为您想要设为管理员的任何用户。
这应该可以解决您的问题。
编辑(因为我误读了你的一些问题):
根据 this link,您确实可以定义默认角色,但您还必须确保在配置文件中重新配置 authManager
-组件以包含默认角色:
'components' => [
'authManager' => [
// ...
'defaultRoles' => ['admin', 'viewer'],
],
],
此角色列表指示始终应为每个用户检查的权限,无论他们是否在 auth_assignment
-table 中有条目。
我遇到了与 op 相同的问题。在修改了一段时间的 xdebug 后终于让它工作了。
我觉得default roles的官方文档遗漏了几个要点,我将在下面结合我的一些个人经验对其进行总结。项目结构基于Yii 2.0 Advanced Project Template
数据库
user
table 包含 id
和 group
。其中 group
是类型 int
,1 表示 admin
,2 表示 author
规则设置
为清楚起见简化了代码。
规则 class,放置实际规则逻辑的地方。
yii/console/controller/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/console/controller/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/commom/config/main.php
将以下内容添加到 return 数组:
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'defaultRoles' => ['admin', 'author'], // your define roles
],
现在是有趣的部分,在控制器下class您想应用规则
yii/backend/controllers/SiteController.php
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => [], // applies to all actions
'roles' => ['admin'], // your defined roles
],
],
],
到目前为止,规则应该有效。在您的控制器 class 下,仔细检查 Yii::$app->getAuthManager()
看看它是否包含您定义的角色。如果不是,则说明 Yii 没有正确选择规则,请再次检查前面的步骤。