Yii2中模块的访问控制

问题描述 投票:2回答:5

我在登录部分遇到了麻烦。我读了这个主题:http://www.yiiframework.com/wiki/771/rbac-super-simple-with-admin-and-user/。然后我按照它的步骤,但在步骤6中,它只配置一个控制器。我有一个名为Admin的模块,里面有很多控制器,我不知道如何将这个访问控制应用到整个模块。谁能帮我 ?对不起,我的英语不好。

login module yii2 rbac
5个回答
2
投票

您可以创建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的行为,它定义了默认访问规则,并将它们与子控制器中的特定行为合并。如果需要,它可以灵活地覆盖某些访问规则。


2
投票

我可以从你提到的文章中提出一种方法的变体。按照描述进行前2个步骤,然后执行以下操作:

1.将字段role添加到User模型,并使用文章示例中的一个常量(User :: ROLE_ADMIN或User :: ROLE_USER)的值来评估它

2.覆盖yii \ web \ User-> can()

public function can($permissionName, $params = [], $allowCaching = true)
{
    /** @var \app\models\User $user */
    $user = $this->identity;
    $access = false;
    do {
        if (\Yii::$app->user->isGuest) {
            break;
        }

        if ($user->role === \common\models\User::ROLE_ADMIN) {
            $access = true;
            break;
        }

        if (is_array($permissionName)) {
            $access = in_array($user->role, $permissionName);
        } else {
            $access = $permissionName === $user->role;
        }
    } while (false);

    return $access;
}

所以现在你可以像这样检查用户的角色:

\Yii::$app->user->can(User::ROLE_USER)

你说:

我不知道如何将此访问控制应用于整个模块。

然后打开您的模块类并将以下内容添加到behavior()方法:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => [User::ROLE_ADMIN]
                ]
            ]
        ]
    ];
}

在此示例中,我们将对ROLE_ADMIN的访问权限授予模块的所有控制器的所有操作。而已。


1
投票

制作自定义模型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;
    }
}
?>

现在打开您的站点控制器并在函数行为部分中添加以下代码:

use app\models\AccessRules;
 public function behaviors()
   {
        return [
            'access' => [
                    'class' => AccessControl::className(),
    // We will override the default rule config with the new AccessRule class
    'ruleConfig' => [
        'class' => AccessRules::className(),
    ],
    'only' => ['create', 'update', 'delete','index'],
    'rules' => [
        [
            'actions' => ['create', 'update', 'delete','index'],
            'allow' => true,
            // Allow admin to create
            'roles' => [
                '1' 
            ],
        ]
    ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

0
投票

根据Yii2 Guide“ACF是一个可以在控制器或模块中使用的动作过滤器”以相同的方式。


0
投票

只需在控制器中添加以下代码即可限制功能

        '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);
                    }
                ],
             ],

        ],
© www.soinside.com 2019 - 2024. All rights reserved.