dastanaron/yii2-db-rbac

YII2中的动态访问控制

安装: 34

依赖关系: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 33

类型:yii2-extension

1.1.2.5 2018-01-11 07:01 UTC

README

俄语 在这里

在不更改代码的情况下创建Yii2访问控制的简单方法。

此模块允许通过UI创建Yii RBAC(基于角色的访问控制)的角色和规则。它还允许通过UI为用户分配角色和规则。通过模块规则检查访问的行为。

集成

安装指南

$ php composer.phar require developeruz/yii2-db-rbac "*"

要正常工作,必须在应用程序配置文件中配置模块 authManager (对于高级应用程序是 common/config/main.php,对于基本应用程序是 config/web.phpconfig/console

    'components' => [
       'authManager' => [
          'class' => 'yii\rbac\DbManager',
        ],
    ...
    ]

运行迁移以创建 DbManager 表(这意味着已经为应用程序配置了数据库连接)

$ yii migrate --migrationPath=@yii/rbac/migrations/

添加模块

将模块包含到配置文件中(对于高级应用程序是 backend/config/main.php,对于基本应用程序是 config/web.php

  'modules' => [
        'permit' => [
            'class' => 'developeruz\db_rbac\Yii2DbRbac',
        ],
    ],

如果您想设置布局,请按照以下方式操作

  'modules' => [
        'permit' => [
            'class' => 'developeruz\db_rbac\Yii2DbRbac',
            'layout' => '//admin'
        ],
    ],

如果您使用CNC,请确保您有正确的模块路由规则

'<module:\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>',
'<module:\w+>/<controller:\w+>/<action:(\w|-)+>/<id:\d+>' => '<module>/<controller>/<action>',

添加链接

/permit/access/role - 管理角色

/permit/access/permission - 管理访问

分配角色给用户

该模块还具有将角色分配给用户的界面。

为了正确工作,模块参数中应指定 User 类。

'modules' => [
        'permit' => [
            'class' => 'app\modules\db_rbac\Yii2DbRbac',
            'params' => [
                'userClass' => 'app\models\User'
            ]
        ],
    ],

用户类应实现 developeruz\db_rbac\interfaces\UserRbacInterface。在大多数情况下,您必须添加函数 getUserName(),它应返回用户名称。

use developeruz\db_rbac\interfaces\UserRbacInterface;

class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
{
...
    public function getUserName()
    {
       return $this->username;
    }
}

要管理id=1的用户角色,请访问 /permit/user/view/1

最简单的方法是将它作为按钮添加到 GridView 中的用户列表中。

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        'id',
        'username',
        'email:email',

        ['class' => 'yii\grid\ActionColumn',
         'template' => '{view}&nbsp;&nbsp;{update}&nbsp;&nbsp;{permit}&nbsp;&nbsp;{delete}',
         'buttons' =>
             [
                 'permit' => function ($url, $model) {
                     return Html::a('<span class="glyphicon glyphicon-wrench"></span>', Url::to(['/permit/user/view', 'id' => $model->id]), [
                         'title' => Yii::t('yii', 'Change user role')
                     ]); },
             ]
        ],
    ],
]);

您还可以在代码中为用户分配角色,例如在创建用户时。

$userRole = Yii::$app->authManager->getRole('name_of_role');
Yii::$app->authManager->assign($userRole, $user->getId());

您还可以通过 User 类中的 can() 方法在代码中检查用户是否有权限。

Yii::$app->user->can($permissionName);

$permissionName - 可以是角色名称或权限名称。

配置模块的访问控制

在配置中,您可以设置具有模块功能访问权限的角色列表。

'modules' => [
        'permit' => [
            'class' => 'app\modules\db_rbac\Yii2DbRbac',
            'params' => [
                'userClass' => 'app\models\User',
                'accessRoles' => ['admin']
            ]
        ],
    ],

通过模块规则检查访问的行为

使用此行为,您不需要在每次操作中编写 Yii::$app->user->can($permissionName)。行为将自动检查。这对于使用第三方模块的访问控制也很有用。

配置行为

如果您想自动检查访问,则必须将行为包含到应用程序配置文件中。

use developeruz\db_rbac\behaviors\AccessBehavior;

 'as AccessBehavior' => [
        'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(),
 ]

EVENT_BEFORE_ACTION 事件中,行为将检查当前用户(Yii::$app->user)对操作的访问。如果以下条件之一成立,则操作允许:

  • 用户对操作有访问权限(规则:module/controller/action)
  • 用户对控制器中的任何操作有访问权限(规则:module/controller)
  • 用户对模块中的任何操作有访问权限(规则:module)

拒绝访问时的重定向

默认情况下,如果用户没有访问权限,行为将抛出 ForbiddenHttpException。应用程序可以按需处理此异常。

您还可以配置 login_url,将未经授权的用户重定向到,或者配置 redirect_url,在拒绝访问时将用户重定向到。

    'as AccessBehavior' => [
        'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(),
        'redirect_url' => '/forbidden',
        'login_url' => Yii::$app->user->loginUrl
    ]

配置默认访问规则

连接行为后,访问权限仅限于具有特定权限的授权用户。您可以通过与控制器(AccessControl)相同的方式在配置文件中创建默认访问权限。

    'as AccessBehavior' => [
        'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(),
        'rules' =>
            ['site' =>
                [
                    [
                        'actions' => ['login', 'index'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['about'],
                        'allow' => true,
                        'roles' => ['admin'],
                    ],
                ]
            ]
    ]

在此示例中,任何用户都可以访问site/loginsite/index,而只有具有admin角色的用户才能访问site/about。配置中描述的规则优先于动态可配置的规则。

配置行为责任区域

默认规则是“除非允许,否则所有操作均被禁止。”如果行为仅用于保护某些路由,而其他所有路由对所有用户都应可访问,请设置protect参数。

'as AccessBehavior' => [
        'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(),
        'protect' => ['admin', 'user', 'site/about'],
        'rules' => [
            'user' => [['actions' => ['login'], 'allow' => true ],
                       ['actions' => ['logout'], 'roles' => ['@'], 'allow' => true ]]
        ]
    ],
    

在此示例中,行为将仅检查用户访问以下路径的权限:以adminusersite / about开头的路径。所有其他路由对所有用户都可用(不受行为验证)。如您在示例中看到的那样,protect参数可以与rules参数结合使用。

Select2 输入配置

要使用将权限分配给角色的权限,您必须创建一个名为permits.yaml的配置文件。如果文件不存在,它将被自动创建,但内容为空。控制器将通过路径@app/config/permits.yaml访问它。应包含系统权限及其描述的内容,以便于选择。

文件的大致内容

user/index: 'Access to viewing of all users'
user/update: 'Access to user editing'
user/delete: 'Access to user removal'
user/create: 'Access to user creation'

贡献

欢迎贡献,并将得到全额认可。我接受通过Pull Requests的贡献。请参阅CONTRIBUTING以获取详细信息。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件