Login Yii2中模块的访问控制
我在登录部分遇到问题。 我读了这个主题:。 然后我按照它的步骤,但在步骤6。它仅为一个控制器配置。我有一个名为Admin的模块,其中有许多控制器,我不知道如何将此访问控制应用于整个模块。有人能帮我吗?Login Yii2中模块的访问控制,login,module,yii2,rbac,Login,Module,Yii2,Rbac,我在登录部分遇到问题。 我读了这个主题:。 然后我按照它的步骤,但在步骤6。它仅为一个控制器配置。我有一个名为Admin的模块,其中有许多控制器,我不知道如何将此访问控制应用于整个模块。有人能帮我吗? 对不起,我的英语不好。您可以创建AdminController类,该类将扩展yii\web\Controller,您可以在behaviors方法中定义访问规则,并使其他模块控制器扩展您的AdminController并覆盖behaviors方法,如下所示: public function beha
对不起,我的英语不好。您可以创建
AdminController
类,该类将扩展yii\web\Controller
,您可以在behaviors
方法中定义访问规则,并使其他模块控制器扩展您的AdminController
并覆盖behaviors
方法,如下所示:
public function behaviors()
{
return \yii\helpers\ArrayHelper::merge(parent::behaviors(), [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
]);
}
这里的
parent::behaviors()
是来自定义默认访问规则的AdminController
的行为,您可以将它们与子控制器中的特定行为合并。如果需要,它可以灵活地覆盖某些访问规则。创建一个自定义模型AccessRules.php
,如下所示:
<?php
namespace app\models;
class AccessRules extends \yii\filters\AccessRule
{
/**
* @inheritdoc
*/
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;
}
// Check if the user is logged in, and the roles match
} elseif (!$user->getIsGuest() && (int)$role === $user->identity->user_role) {
return true;
}
}
return false;
}
}
?>
我可以从你提到的那篇文章中提出一种不同的方法。 按照说明执行前2步,然后执行以下操作: 1.将字段
role
添加到用户模型中,并使用本文示例中的一个常量值(User::role\u ADMIN或User::role\u User)对其进行评估
2.覆盖yii\web\User->can()
现在,您可以像这样检查用户角色:
\Yii::$app->user->can(User::ROLE_USER)
3.你说:
我不知道如何将访问控制应用于整个模块
然后打开模块类并将以下内容添加到behaviors()方法:
在本例中,我们向模块的所有控制器的所有操作授予对角色_ADMIN的访问权。
就这样。根据
“ACF是一个动作过滤器,可以在控制器或模块中使用”,同样的方式。只需在控制器中添加以下代码,即可限制其功能
'access' => [
'class' => AccessControl::className(),
'rules' =>
[
[
'actions' => ['index','view'],
'allow' => true,
'roles' => ['@']
],
[
'actions' => ['create','update','delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action)
{
return Admin::isUserAdmin(Yii::$app->user->identity->username);
}
],
],
],
所以Yii2模块没有行为方法,对吗?@user1571234它有,如果你想为整个模块设置访问规则,并且它的控制器都没有不同的访问规则,你可以在模块的
行为方法中定义它们。如果某些控制器需要不同的行为,在父控制器中定义访问规则并继承这些规则将为您提供更大的灵活性。为了清晰起见,您使用了user\u role
。当使用Yi2 advanced并运行迁移时,将使用默认值10
创建列role
。并不是说你不能改变它:)只是为了防止其他人在这里绊倒,我想指出这种差异。
\Yii::$app->user->can(User::ROLE_USER)
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => [User::ROLE_ADMIN]
]
]
]
];
}
'access' => [
'class' => AccessControl::className(),
'rules' =>
[
[
'actions' => ['index','view'],
'allow' => true,
'roles' => ['@']
],
[
'actions' => ['create','update','delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action)
{
return Admin::isUserAdmin(Yii::$app->user->identity->username);
}
],
],
],