Yii2 中的用户角色,来自 DB 值
User roles in Yii2, from DB value
这乍一看可能听起来很重复,但可用的答案不够清晰,无法解决我的问题。
我有一个用户数据库列表,一个元组如下所示。
[
'id' => '131',
'username' => 'mat',
'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191',
'authKey' => 'test100key',
'accessToken' => '100-token',
'role' => 'editor',
]
现在我想创建一个名为manager的用户类型,并在控制器中设置这样的访问控制。
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['create', 'view', 'index'], // Define specific actions
'allow' => true, // Has access
'roles' => ['editor'], // '@' All logged in users / or your access role e.g. 'admin', 'user'
],
[
我正在努力以最少的麻烦实现这一点,但我对 yii/yii2 并不是很熟悉。 RBAC 实际上让我感到困惑,我发现很难理解文档。
我只需要创建三种类型的用户角色。我了解控制对各种操作的访问。
用户数据来自 table 将被另一个应用程序实时修改。
自己解决了。框架代码略微调整,我想如果我选择更新 Yii 任何一天都会遇到麻烦。
在
vendor/yiisoft/yii2/filters/AccessRule.php
edited the matchRole Method as follows
protected function matchRole($user)
{
if (empty($this->roles)) {
return true;
}
foreach ($this->roles as $role) {
if ($role === '?') {
if ($user->getIsGuest()) {
return true;
}
} elseif ($role === '@') {
if (!$user->getIsGuest()) {
return true;
}
} elseif ($user->can($role)) {
return true;
}
elseif (isset($user->identity->role)){
if($role == $user->identity->role) {
return true;
}
}
}
return false;
}
根据您自己的回答,我发现您并不真的需要 RBAC,只需检查一个 属性 用户即可。您可以直接在控制器中执行此操作(而且您无论如何都不能修改核心文件):
在控制器中添加:
public function behaviors()
{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['create', 'view', 'index'],
'rules' => [
[
'allow' => true,
'matchCallback' => function ($rule, $action) {
return !\Yii::$app->user->isGuest
&& \Yii::$app->user->identity->role === 'editor';
},
],
],
],
];
}
matchCallback
是将调用以确定是否应应用规则的回调。您需要先检查用户是否不是访客,否则 Yii::$app->user->identity
是 null
.
这乍一看可能听起来很重复,但可用的答案不够清晰,无法解决我的问题。
我有一个用户数据库列表,一个元组如下所示。
[
'id' => '131',
'username' => 'mat',
'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191',
'authKey' => 'test100key',
'accessToken' => '100-token',
'role' => 'editor',
]
现在我想创建一个名为manager的用户类型,并在控制器中设置这样的访问控制。
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['create', 'view', 'index'], // Define specific actions
'allow' => true, // Has access
'roles' => ['editor'], // '@' All logged in users / or your access role e.g. 'admin', 'user'
],
[
我正在努力以最少的麻烦实现这一点,但我对 yii/yii2 并不是很熟悉。 RBAC 实际上让我感到困惑,我发现很难理解文档。
我只需要创建三种类型的用户角色。我了解控制对各种操作的访问。
用户数据来自 table 将被另一个应用程序实时修改。
自己解决了。框架代码略微调整,我想如果我选择更新 Yii 任何一天都会遇到麻烦。
在
vendor/yiisoft/yii2/filters/AccessRule.php edited the matchRole Method as follows
protected function matchRole($user)
{
if (empty($this->roles)) {
return true;
}
foreach ($this->roles as $role) {
if ($role === '?') {
if ($user->getIsGuest()) {
return true;
}
} elseif ($role === '@') {
if (!$user->getIsGuest()) {
return true;
}
} elseif ($user->can($role)) {
return true;
}
elseif (isset($user->identity->role)){
if($role == $user->identity->role) {
return true;
}
}
}
return false;
}
根据您自己的回答,我发现您并不真的需要 RBAC,只需检查一个 属性 用户即可。您可以直接在控制器中执行此操作(而且您无论如何都不能修改核心文件):
在控制器中添加:
public function behaviors()
{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['create', 'view', 'index'],
'rules' => [
[
'allow' => true,
'matchCallback' => function ($rule, $action) {
return !\Yii::$app->user->isGuest
&& \Yii::$app->user->identity->role === 'editor';
},
],
],
],
];
}
matchCallback
是将调用以确定是否应应用规则的回调。您需要先检查用户是否不是访客,否则 Yii::$app->user->identity
是 null
.