{"id":16292419,"url":"https://github.com/developeruz/yii2-db-rbac","last_synced_at":"2025-04-06T16:14:52.165Z","repository":{"id":23811709,"uuid":"27188144","full_name":"developeruz/yii2-db-rbac","owner":"developeruz","description":"Dynamic control of access rights in YII2","archived":false,"fork":false,"pushed_at":"2018-06-25T07:46:57.000Z","size":56,"stargazers_count":110,"open_issues_count":5,"forks_count":33,"subscribers_count":23,"default_branch":"master","last_synced_at":"2024-04-23T16:43:13.950Z","etag":null,"topics":["rbac","yii2"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/developeruz.png","metadata":{"files":{"readme":"README.RU.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.RU.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-11-26T17:29:33.000Z","updated_at":"2023-12-26T13:47:16.000Z","dependencies_parsed_at":"2022-07-27T04:17:23.668Z","dependency_job_id":null,"html_url":"https://github.com/developeruz/yii2-db-rbac","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/developeruz%2Fyii2-db-rbac","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/developeruz%2Fyii2-db-rbac/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/developeruz%2Fyii2-db-rbac/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/developeruz%2Fyii2-db-rbac/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/developeruz","download_url":"https://codeload.github.com/developeruz/yii2-db-rbac/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247509237,"owners_count":20950232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rbac","yii2"],"created_at":"2024-10-10T20:06:27.436Z","updated_at":"2025-04-06T16:14:52.137Z","avatar_url":"https://github.com/developeruz.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Динамическая настройка прав доступа для Yii2\n============\n\nПростой способ настроить права доступа в Yii без необходимости писать код.\n\nМодуль для создания ролей и прав доступа через веб-интерфейс, так же имеющий веб интерфейс для назначения ролей пользователям\nПоведение для приложения, проверяющее право доступа к action по внесенным в модуле правилам.\n\n### Установка:###\n\n```bash\n$ php composer.phar require developeruz/yii2-db-rbac \"*\"\n```\n\nДля корректной работы модуля необходимо настроить authManager в конфиге приложения (common/config/main.php для advanced или config/web.php и config/console  для basic приложения)\n```php\n    'components' =\u003e [\n       'authManager' =\u003e [\n          'class' =\u003e 'yii\\rbac\\DbManager',\n        ],\n    ...\n    ]\n```\n\nИ выполнить миграции, создающие таблицы для DbManager (подразумевается, что коннект к БД для приложения уже настроен)\n```bash\n$ yii migrate --migrationPath=@yii/rbac/migrations/\n```\n\nПодключение модуля\n==================\n\nВ конфиге приложения (backend/config/main.php для advanced или config/web.php для basic приложения) прописываем модуль\n```php\n  'modules' =\u003e [\n        'permit' =\u003e [\n            'class' =\u003e 'developeruz\\db_rbac\\Yii2DbRbac',\n        ],\n    ],\n```\nЕсли нужно передать layout это можно сделать так:\n```php\n  'modules' =\u003e [\n        'permit' =\u003e [\n            'class' =\u003e 'developeruz\\db_rbac\\Yii2DbRbac',\n            'layout' =\u003e '//admin'\n        ],\n    ],\n```\n\nЕсли вы используете ЧПУ, то убедитесь что у вас прописаны правила роутинга для модулей\n```php\n'\u003cmodule:\\w+\u003e/\u003ccontroller:\\w+\u003e/\u003caction:(\\w|-)+\u003e' =\u003e '\u003cmodule\u003e/\u003ccontroller\u003e/\u003caction\u003e',\n'\u003cmodule:\\w+\u003e/\u003ccontroller:\\w+\u003e/\u003caction:(\\w|-)+\u003e/\u003cid:\\d+\u003e' =\u003e '\u003cmodule\u003e/\u003ccontroller\u003e/\u003caction\u003e',\n```\n\n**Добавляем ссылки в меню**\n\n**/permit/access/role - управление ролями**\n\n**/permit/access/permission - управление правами доступа**\n\n### Назначение ролей пользователям ###\nПо многочисленным просьбам в модуль добавлен интерфейс для назначения ролей пользователям. \n\nДля корректной работы модуля нужно указать в параметрах модуля класс `User`.\n```php\n'modules' =\u003e [\n        'permit' =\u003e [\n            'class' =\u003e 'app\\modules\\db_rbac\\Yii2DbRbac',\n            'params' =\u003e [\n                'userClass' =\u003e 'app\\models\\User'\n            ]\n        ],\n    ],\n```\n\nКласс User должен реализовывать интерфейс `developeruz\\db_rbac\\interfaces\\UserRbacInterface`. \nВ большинстве случаев придется дописать в нем 1 функцию `getUserName()` которая будет возвращать отображаемое имя пользователя.\n```php\nuse developeruz\\db_rbac\\interfaces\\UserRbacInterface;\n\nclass User extends ActiveRecord implements IdentityInterface, UserRbacInterface\n{\n...\n    public function getUserName()\n    {\n       return $this-\u003eusername;\n    }\n}\n```\n\n**Управление ролью пользователя происходит на странице `/permit/user/view/1` для пользователя с id=1.**\nУдобнее всего дописать кнопку на эту страницу в Grid со списком пользователей.\n```php\necho GridView::widget([\n    'dataProvider' =\u003e $dataProvider,\n    'columns' =\u003e [\n        ['class' =\u003e 'yii\\grid\\SerialColumn'],\n\n        'id',\n        'username',\n        'email:email',\n\n        ['class' =\u003e 'yii\\grid\\ActionColumn',\n         'template' =\u003e '{view}\u0026nbsp;\u0026nbsp;{update}\u0026nbsp;\u0026nbsp;{permit}\u0026nbsp;\u0026nbsp;{delete}',\n         'buttons' =\u003e\n             [\n                 'permit' =\u003e function ($url, $model) {\n                     return Html::a('\u003cspan class=\"glyphicon glyphicon-wrench\"\u003e\u003c/span\u003e', Url::to(['/permit/user/view', 'id' =\u003e $model-\u003eid]), [\n                         'title' =\u003e Yii::t('yii', 'Change user role')\n                     ]); },\n             ]\n        ],\n    ],\n]);\n```\n\nПрисвоить роль пользователю можно и в коде, например при создании нового пользователя. \n```php\n$userRole = Yii::$app-\u003eauthManager-\u003egetRole('name_of_role');\nYii::$app-\u003eauthManager-\u003eassign($userRole, $user-\u003egetId());\n```\n\nПроверить, имеет ли пользователь право на действие можно через метод `can()` компонента User\n```php\nYii::$app-\u003euser-\u003ecan($permissionName);\n```\n$permissionName - может быть как ролью так и правом\n\n### Ограничение доступа к модулю на основе ролей ###\n\nВ конфиге модуля можно передать список ролей, у которых есть доступ к функционалу модуля.\n```php\n'modules' =\u003e [\n        'permit' =\u003e [\n            'class' =\u003e 'app\\modules\\db_rbac\\Yii2DbRbac',\n            'params' =\u003e [\n                'userClass' =\u003e 'app\\models\\User',\n                'accessRoles' =\u003e ['admin']\n            ]\n        ],\n    ],\n```\n\n\nПоведение, динамически проверяющее наличие прав\n===============================================\n\nДанное поведение позволяет не писать Yii::$app-\u003euser-\u003ecan($permissionName); в каждом action, а проверять права доступа на лету.\nЭто удобно для гибкой настройки прав при использовании сторонних модулей.\n\n### Подключение поведения ###\nВ конфиге того приложения, доступ к которому следует проверять на лету, необходимо подключить поведение\n```php\nuse developeruz\\db_rbac\\behaviors\\AccessBehavior;\n\n 'as AccessBehavior' =\u003e [\n        'class' =\u003e \\developeruz\\db_rbac\\behaviors\\AccessBehavior::className(),\n ]\n```\nС этого момента, после обработки запроса (событие EVENT_BEFORE_ACTION) проверяются права текущего пользователя (Yii::$app-\u003euser) на выполнение запрашиваемого действия (Yii::$app-\u003euser-\u003ecan())\nДействие считается разрешенным, если:\n - пользователю разрешен доступ к конкретному action (правило записано как: module/controller/action)\n - пользователю разрешен доступ к любым action данного контроллера (правило записано как: module/controller)\n - пользователю разрешен доступ к любым action данного модуля (правило записано как: module)\n\n### Настройка редиректа при отсутствии доступа###\nПо умолчанию, при отсутствии у пользователя доступа, поведение бросает **ForbiddenHttpException**, который может обрабатываться приложением так как ему нужно.\n\nТак-же можно настроить **login_url** для редиректа не авторизованного пользователя, в случаи отсутствия у него прав доступа к данной странице и **redirect_url** для перенаправления вне зависимости от авторизованности пользователя\n```php\n    'as AccessBehavior' =\u003e [\n        'class' =\u003e \\developeruz\\db_rbac\\behaviors\\AccessBehavior::className(),\n        'redirect_url' =\u003e '/forbidden',\n        'login_url' =\u003e Yii::$app-\u003euser-\u003eloginUrl\n    ]\n```\n\n### Настройка прав доступа по умолчанию ###\nПосле подключения поведения, доступ становится возможен только авторизованному пользователю, имеющему некие права.\nДля исключений из этого правила можно прописать доступы по умолчанию в том же формате AccessControl, что и в контроллере:\n```php\n    'as AccessBehavior' =\u003e [\n        'class' =\u003e \\developeruz\\db_rbac\\behaviors\\AccessBehavior::className(),\n        'rules' =\u003e\n            ['site' =\u003e\n                [\n                    [\n                        'actions' =\u003e ['login', 'index'],\n                        'allow' =\u003e true,\n                    ],\n                    [\n                        'actions' =\u003e ['about'],\n                        'allow' =\u003e true,\n                        'roles' =\u003e ['admin'],\n                    ],\n                ]\n            ]\n    ]\n```\nВ приведенном выше примере разрешен доступ любому пользователю к site/login и site/index и доступ пользователя с ролью admin к site/about\nПравила прописанные в конфиге имеют приоритет над динамически настраиваемыми правилами.\n\n### Настройка зоны ответственности поведения\nПо умолчанию действует правило \"запрещено все, что не разрещено\". Если поведение должно защищать только некоторые пути, \nа все остальные должны быть доступны всем, то в настройках поведения можно задать параметр `protect`:\n```php\n'as AccessBehavior' =\u003e [\n        'class' =\u003e \\developeruz\\db_rbac\\behaviors\\AccessBehavior::className(),\n        'protect' =\u003e ['admin', 'user', 'site/about'],\n        'rules' =\u003e [\n            'user' =\u003e [['actions' =\u003e ['login'], 'allow' =\u003e true ],\n                       ['actions' =\u003e ['logout'], 'roles' =\u003e ['@'], 'allow' =\u003e true ]]\n        ]\n    ],\n    \n```\nВ данном примере поведение будет проверять права пользователя на доступ к странице только для путей начинающихся с `admin`, `user` и `site/about`. \nВсе остальные пути становятся доступными всем (не проверяются данным поведением). Как видно из примера, параметр `protect` можно комбинировать с `rules`.\n\nСотрудничество\n==============\n\nЯ с удовольствием и благодарностью приму ваши предложения по улучшению модуля. Все предложения следует подавать через Pull Request. \nО том как создать Pull Request смотрите в [CONTRIBUTING](CONTRIBUTING.RU.md).\n\nLicense\n=======\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeveloperuz%2Fyii2-db-rbac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeveloperuz%2Fyii2-db-rbac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeveloperuz%2Fyii2-db-rbac/lists"}