Commit 2f8b8e0ff6464eab8d48e8004c1191f99a722eb7
1 parent
f91c1ae8
this commin on a english)
Права и роли перенес в common components
Showing
18 changed files
with
1102 additions
and
3 deletions
Show diff stats
backend/config/main.php
| @@ -16,7 +16,7 @@ return [ | @@ -16,7 +16,7 @@ return [ | ||
| 16 | 'bootstrap' => ['log'], | 16 | 'bootstrap' => ['log'], |
| 17 | 'modules' => [ | 17 | 'modules' => [ |
| 18 | 'permit' => [ | 18 | 'permit' => [ |
| 19 | - 'class' => 'developeruz\db_rbac\Yii2DbRbac', | 19 | + 'class' => 'common\components\developeruz\db_rbac\Yii2DbRbac', |
| 20 | 'params' => [ | 20 | 'params' => [ |
| 21 | 'userClass' => 'common\models\User' | 21 | 'userClass' => 'common\models\User' |
| 22 | ] | 22 | ] |
| 1 | +The MIT License (MIT) | ||
| 2 | + | ||
| 3 | +Copyright (c) 2014 Elvira Sheina | ||
| 4 | + | ||
| 5 | +Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 6 | +of this software and associated documentation files (the "Software"), to deal | ||
| 7 | +in the Software without restriction, including without limitation the rights | ||
| 8 | +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 9 | +copies of the Software, and to permit persons to whom the Software is | ||
| 10 | +furnished to do so, subject to the following conditions: | ||
| 11 | + | ||
| 12 | +The above copyright notice and this permission notice shall be included in all | ||
| 13 | +copies or substantial portions of the Software. | ||
| 14 | + | ||
| 15 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 16 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 17 | +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 18 | +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 19 | +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 20 | +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| 21 | +SOFTWARE. | ||
| 22 | + |
| 1 | +Динамическая настройка прав доступа для Yii2 | ||
| 2 | +============ | ||
| 3 | + | ||
| 4 | +Модуль для создания ролей и прав доступа через веб-интерфейс, так же имеющий веб интерфейс для назначения ролей пользователям | ||
| 5 | +Поведение для приложения, проверяющее право доступа к action по внесенным в модуле правилам. | ||
| 6 | + | ||
| 7 | +###Установка:### | ||
| 8 | +```bash | ||
| 9 | +$ php composer.phar require developeruz/yii2-db-rbac "*" | ||
| 10 | +``` | ||
| 11 | + | ||
| 12 | +Для корректной работы модуля необходимо настроить authManager в конфиге приложения (common/config/main.php для advanced или config/web.php и config/console для basic приложения) | ||
| 13 | +```php | ||
| 14 | + 'components' => [ | ||
| 15 | + 'authManager' => [ | ||
| 16 | + 'class' => 'yii\rbac\DbManager', | ||
| 17 | + ], | ||
| 18 | + ... | ||
| 19 | + ] | ||
| 20 | +``` | ||
| 21 | + | ||
| 22 | +И выполнить миграции, создающие таблицы для DbManager (подразумевается, что коннект к БД для приложения уже настроен) | ||
| 23 | +```bash | ||
| 24 | +$ yii migrate --migrationPath=@yii/rbac/migrations/ | ||
| 25 | +``` | ||
| 26 | + | ||
| 27 | +##Подключение модуля## | ||
| 28 | +В конфиге приложения (backend/config/main.php для advanced или config/web.php для basic приложения) прописываем модуль | ||
| 29 | +```php | ||
| 30 | + 'modules' => [ | ||
| 31 | + 'permit' => [ | ||
| 32 | + 'class' => 'developeruz\db_rbac\Yii2DbRbac', | ||
| 33 | + ], | ||
| 34 | + ], | ||
| 35 | +``` | ||
| 36 | +Если нужно передать layout это можно сделать так: | ||
| 37 | +```php | ||
| 38 | + 'modules' => [ | ||
| 39 | + 'permit' => [ | ||
| 40 | + 'class' => 'developeruz\db_rbac\Yii2DbRbac', | ||
| 41 | + 'layout' => '//admin' | ||
| 42 | + ], | ||
| 43 | + ], | ||
| 44 | +``` | ||
| 45 | + | ||
| 46 | +Если вы используете ЧПУ, то убедитесь что у вас прописаны правила роутинга для модулей | ||
| 47 | +```php | ||
| 48 | +'<module:\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>', | ||
| 49 | +'<module:\w+>/<controller:\w+>/<action:(\w|-)+>/<id:\d+>' => '<module>/<controller>/<action>', | ||
| 50 | +``` | ||
| 51 | + | ||
| 52 | +**Добавляем ссылки в меню** | ||
| 53 | + | ||
| 54 | +**/permit/access/role - управление ролями** | ||
| 55 | + | ||
| 56 | +**/permit/access/permission - управление правами доступа** | ||
| 57 | + | ||
| 58 | +###Назначение ролей пользователям### | ||
| 59 | +По многочисленным просьбам в модуль добавлен интерфейс для назначения ролей пользователям. | ||
| 60 | + | ||
| 61 | +Для корректной работы модуля нужно указать в параметрах модуля класс `User`. | ||
| 62 | +```php | ||
| 63 | +'modules' => [ | ||
| 64 | + 'permit' => [ | ||
| 65 | + 'class' => 'app\modules\db_rbac\Yii2DbRbac', | ||
| 66 | + 'params' => [ | ||
| 67 | + 'userClass' => 'app\models\User' | ||
| 68 | + ] | ||
| 69 | + ], | ||
| 70 | + ], | ||
| 71 | +``` | ||
| 72 | + | ||
| 73 | +Класс User должен реализовывать интерфейс `developeruz\db_rbac\interfaces\UserRbacInterface`. | ||
| 74 | +В большинстве случаев придется дописать в нем 1 функцию `getUserName()` которая будет возвращать отображаемое имя пользователя. | ||
| 75 | +```php | ||
| 76 | +use developeruz\db_rbac\interfaces\UserRbacInterface; | ||
| 77 | + | ||
| 78 | +class User extends ActiveRecord implements IdentityInterface, UserRbacInterface | ||
| 79 | +{ | ||
| 80 | +... | ||
| 81 | + public function getUserName() | ||
| 82 | + { | ||
| 83 | + return $this->username; | ||
| 84 | + } | ||
| 85 | +} | ||
| 86 | +``` | ||
| 87 | + | ||
| 88 | +**Управление ролью пользователя происходит на странице `/permit/user/view/1` для пользователя с id=1.** | ||
| 89 | +Удобнее всего дописать кнопку на эту страницу в Grid со списком пользователей. | ||
| 90 | +```php | ||
| 91 | +echo GridView::widget([ | ||
| 92 | + 'dataProvider' => $dataProvider, | ||
| 93 | + 'columns' => [ | ||
| 94 | + ['class' => 'yii\grid\SerialColumn'], | ||
| 95 | + | ||
| 96 | + 'id', | ||
| 97 | + 'username', | ||
| 98 | + 'email:email', | ||
| 99 | + | ||
| 100 | + ['class' => 'yii\grid\ActionColumn', | ||
| 101 | + 'template' => '{view} {update} {permit} {delete}', | ||
| 102 | + 'buttons' => | ||
| 103 | + [ | ||
| 104 | + 'permit' => function ($url, $model) { | ||
| 105 | + return Html::a('<span class="glyphicon glyphicon-wrench"></span>', Url::to(['/permit/user/view', 'id' => $model->id]), [ | ||
| 106 | + 'title' => Yii::t('yii', 'Change user role') | ||
| 107 | + ]); }, | ||
| 108 | + ] | ||
| 109 | + ], | ||
| 110 | + ], | ||
| 111 | +]); | ||
| 112 | +``` | ||
| 113 | + | ||
| 114 | +Присвоить роль пользователю можно и в коде, например при создании нового пользователя. | ||
| 115 | +```php | ||
| 116 | +$userRole = Yii::$app->authManager->getRole('name_of_role'); | ||
| 117 | +Yii::$app->authManager->assign($userRole, $user->getId()); | ||
| 118 | +``` | ||
| 119 | + | ||
| 120 | +Проверить, имеет ли пользователь право на действие можно через метод `can()` компонента User | ||
| 121 | +```php | ||
| 122 | +Yii::$app->user->can($permissionName); | ||
| 123 | +``` | ||
| 124 | +$permissionName - может быть как ролью так и правом | ||
| 125 | + | ||
| 126 | +##Поведение, динамически проверяющее наличие прав## | ||
| 127 | + | ||
| 128 | +Данное поведение позволяет не писать Yii::$app->user->can($permissionName); в каждом action, а проверять права доступа на лету. | ||
| 129 | +Это удобно для гибкой настройки прав при использовании сторонних модулей. | ||
| 130 | + | ||
| 131 | +###Подключение поведения### | ||
| 132 | +В конфиге того приложения, доступ к которому следует проверять на лету, необходимо подключить поведение | ||
| 133 | +```php | ||
| 134 | +use developeruz\db_rbac\behaviors\AccessBehavior; | ||
| 135 | + | ||
| 136 | + 'as AccessBehavior' => [ | ||
| 137 | + 'class' => AccessBehavior::className(), | ||
| 138 | + ] | ||
| 139 | +``` | ||
| 140 | +С этого момента, после обработки запроса (событие EVENT_AFTER_REQUEST) проверяются права текущего пользователя (Yii::$app->user) на выполнение запрашиваемого действия (Yii::$app->user->can()) | ||
| 141 | +Действие считается разрешенным, если: | ||
| 142 | + - пользователю разрешен доступ к конкретному action (правило записано как: module/controller/action) | ||
| 143 | + - пользователю разрешен доступ к любым action данного контроллера (правило записано как: module/controller) | ||
| 144 | + - пользователю разрешен доступ к любым action данного модуля (правило записано как: module) | ||
| 145 | + | ||
| 146 | +###Настройка прав доступа по умолчанию### | ||
| 147 | +После подключения поведения, доступ становится возможен только авторизованному пользователю, имеющему некие права. | ||
| 148 | +Для исключений из этого правила можно прописать доступы по умолчанию в том же формате AccessControl, что и в контроллере: | ||
| 149 | +```php | ||
| 150 | + 'as AccessBehavior' => [ | ||
| 151 | + 'class' => AccessBehavior::className(), | ||
| 152 | + 'rules' => | ||
| 153 | + ['site' => | ||
| 154 | + [ | ||
| 155 | + [ | ||
| 156 | + 'actions' => ['login', 'index'], | ||
| 157 | + 'allow' => true, | ||
| 158 | + ], | ||
| 159 | + [ | ||
| 160 | + 'actions' => ['about'], | ||
| 161 | + 'allow' => true, | ||
| 162 | + 'roles' => ['admin'], | ||
| 163 | + ], | ||
| 164 | + ] | ||
| 165 | + ] | ||
| 166 | + ] | ||
| 167 | +``` | ||
| 168 | +В приведенном выше примере разрешен доступ любому пользователю к site/login и site/index и доступ пользователя с ролью admin к site/about | ||
| 169 | +Правила прописанные в конфиге имеют приоритет над динамически настраиваемыми правилами. | ||
| 0 | \ No newline at end of file | 170 | \ No newline at end of file |
common/components/developeruz/db_rbac/Yii2DbRbac.php
0 → 100644
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * Yii2DbRbac for Yii2 | ||
| 4 | + * | ||
| 5 | + * @author Elle <elleuz@gmail.com> | ||
| 6 | + * @version 0.1 | ||
| 7 | + * @package Yii2DbRbac for Yii2 | ||
| 8 | + * | ||
| 9 | + */ | ||
| 10 | +namespace common\components\developeruz\db_rbac; | ||
| 11 | + | ||
| 12 | +use Yii; | ||
| 13 | + | ||
| 14 | +class Yii2DbRbac extends \yii\base\Module | ||
| 15 | +{ | ||
| 16 | + public $controllerNamespace = 'common\components\developeruz\db_rbac\controllers'; | ||
| 17 | + public $userClass; | ||
| 18 | + | ||
| 19 | + public function init() | ||
| 20 | + { | ||
| 21 | + parent::init(); | ||
| 22 | + $this->registerTranslations(); | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + public function registerTranslations() | ||
| 26 | + { | ||
| 27 | + Yii::$app->i18n->translations['db_rbac'] = [ | ||
| 28 | + 'class' => 'yii\i18n\PhpMessageSource', | ||
| 29 | + 'sourceLanguage' => 'ru-Ru', | ||
| 30 | + 'basePath' => '@developeruz/db_rbac/messages', | ||
| 31 | + ]; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + public static function t($category, $message, $params = [], $language = null) | ||
| 35 | + { | ||
| 36 | + return Yii::t('modules/db_rbac/' . $category, $message, $params, $language); | ||
| 37 | + } | ||
| 38 | +} |
common/components/developeruz/db_rbac/behaviors/AccessBehavior.php
0 → 100644
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * AccessBehavior for Yii2 | ||
| 4 | + * | ||
| 5 | + * @author Elle <elleuz@gmail.com> | ||
| 6 | + * @version 0.1 | ||
| 7 | + * @package AccessBehavior for Yii2 | ||
| 8 | + * | ||
| 9 | + */ | ||
| 10 | +namespace developeruz\db_rbac\behaviors; | ||
| 11 | + | ||
| 12 | +use Yii; | ||
| 13 | +use yii\behaviors\AttributeBehavior; | ||
| 14 | +use yii\di\Instance; | ||
| 15 | +use yii\base\Module; | ||
| 16 | +use yii\web\Application; | ||
| 17 | +use yii\web\User; | ||
| 18 | +use yii\filters\AccessControl; | ||
| 19 | +use yii\web\ForbiddenHttpException; | ||
| 20 | + | ||
| 21 | +class AccessBehavior extends AttributeBehavior { | ||
| 22 | + | ||
| 23 | + public $rules=[]; | ||
| 24 | + | ||
| 25 | + private $_rules = []; | ||
| 26 | + | ||
| 27 | + public function events() | ||
| 28 | + { | ||
| 29 | + return [ | ||
| 30 | + Module::EVENT_BEFORE_ACTION => 'interception', | ||
| 31 | + ]; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + public function interception($event) | ||
| 35 | + { | ||
| 36 | + if(!isset( Yii::$app->i18n->translations['db_rbac'])){ | ||
| 37 | + Yii::$app->i18n->translations['db_rbac'] = [ | ||
| 38 | + 'class' => 'yii\i18n\PhpMessageSource', | ||
| 39 | + 'sourceLanguage' => 'ru-Ru', | ||
| 40 | + 'basePath' => '@developeruz/db_rbac/messages', | ||
| 41 | + ]; | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + $route = Yii::$app->getRequest()->resolve(); | ||
| 45 | + | ||
| 46 | + //Проверяем права по конфигу | ||
| 47 | + $this->createRule(); | ||
| 48 | + $user = Instance::ensure(Yii::$app->user, User::className()); | ||
| 49 | + $request = Yii::$app->getRequest(); | ||
| 50 | + $action = $event->action; | ||
| 51 | + | ||
| 52 | + if(!$this->cheсkByRule($action, $user, $request)) | ||
| 53 | + { | ||
| 54 | + //И по AuthManager | ||
| 55 | + if(!$this->checkPermission($route)) | ||
| 56 | + throw new ForbiddenHttpException(Yii::t('db_rbac','Недостаточно прав')); | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + protected function createRule() | ||
| 61 | + { | ||
| 62 | + foreach($this->rules as $controller => $rule) | ||
| 63 | + { | ||
| 64 | + foreach ($rule as $singleRule) { | ||
| 65 | + if (is_array($singleRule)) { | ||
| 66 | + $option = [ | ||
| 67 | + 'controllers' => [$controller], | ||
| 68 | + 'class' => 'yii\filters\AccessRule' | ||
| 69 | + ]; | ||
| 70 | + $this->_rules[] = Yii::createObject(array_merge($option, $singleRule)); | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + protected function cheсkByRule($action, $user, $request) | ||
| 77 | + { | ||
| 78 | + foreach ($this->_rules as $rule) { | ||
| 79 | + if ($rule->allows($action, $user, $request)) | ||
| 80 | + return true; | ||
| 81 | + } | ||
| 82 | + return false; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + protected function checkPermission($route) | ||
| 86 | + { | ||
| 87 | + //$route[0] - is the route, $route[1] - is the associated parameters | ||
| 88 | + | ||
| 89 | + $routePathTmp = explode('/', $route[0]); | ||
| 90 | + $routeVariant = array_shift($routePathTmp); | ||
| 91 | + if(Yii::$app->user->can($routeVariant, $route[1])) | ||
| 92 | + return true; | ||
| 93 | + | ||
| 94 | + foreach($routePathTmp as $routePart) | ||
| 95 | + { | ||
| 96 | + $routeVariant .= '/'.$routePart; | ||
| 97 | + if(Yii::$app->user->can($routeVariant, $route[1])) | ||
| 98 | + return true; | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + return false; | ||
| 102 | + } | ||
| 103 | +} | ||
| 0 | \ No newline at end of file | 104 | \ No newline at end of file |
common/components/developeruz/db_rbac/composer.json
0 → 100644
| 1 | +{ | ||
| 2 | + "name": "developeruz/yii2-db-rbac", | ||
| 3 | + "description": "Dynamic control of access rights in YII2", | ||
| 4 | + "keywords": ["yii", "rbac"], | ||
| 5 | + "type": "yii2-extension", | ||
| 6 | + "license": "MIT", | ||
| 7 | + "authors": [ | ||
| 8 | + { | ||
| 9 | + "name": "Elvira Sheina", | ||
| 10 | + "email": "elleuz@gmail.com", | ||
| 11 | + "homepage": "http://developer.uz" | ||
| 12 | + } | ||
| 13 | + ], | ||
| 14 | + "require": { | ||
| 15 | + "yiisoft/yii2": "*" | ||
| 16 | + }, | ||
| 17 | + "support": { | ||
| 18 | + "issues": "https://github.com/developeruz/yii2-db-rbac/issues" | ||
| 19 | + }, | ||
| 20 | + "autoload": { | ||
| 21 | + "psr-4": { | ||
| 22 | + "developeruz\\db_rbac\\": "" | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | +} | ||
| 0 | \ No newline at end of file | 26 | \ No newline at end of file |
common/components/developeruz/db_rbac/controllers/AccessController.php
0 → 100644
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * AccessController for Yii2 | ||
| 4 | + * | ||
| 5 | + * @author Elle <elleuz@gmail.com> | ||
| 6 | + * @version 0.1 | ||
| 7 | + * @package AccessController for Yii2 | ||
| 8 | + * | ||
| 9 | + */ | ||
| 10 | +namespace common\components\developeruz\db_rbac\controllers; | ||
| 11 | + | ||
| 12 | +use Yii; | ||
| 13 | +use yii\web\Controller; | ||
| 14 | +use yii\web\BadRequestHttpException; | ||
| 15 | +use yii\rbac\Role; | ||
| 16 | +use yii\rbac\Permission; | ||
| 17 | +use yii\helpers\ArrayHelper; | ||
| 18 | +use yii\helpers\Url; | ||
| 19 | +use yii\validators\RegularExpressionValidator; | ||
| 20 | + | ||
| 21 | +class AccessController extends Controller | ||
| 22 | +{ | ||
| 23 | + protected $error; | ||
| 24 | + protected $pattern4Role = '/^[a-zA-Z0-9_-]+$/'; | ||
| 25 | + protected $pattern4Permission = '/^[a-zA-Z0-9_\/-]+$/'; | ||
| 26 | + | ||
| 27 | + public function actions() | ||
| 28 | + { | ||
| 29 | + return [ | ||
| 30 | + 'error' => [ | ||
| 31 | + 'class' => 'yii\web\ErrorAction', | ||
| 32 | + ], | ||
| 33 | + ]; | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + public function actionRole() | ||
| 37 | + { | ||
| 38 | + return $this->render('role'); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + public function actionAddRole() | ||
| 42 | + { | ||
| 43 | + if (Yii::$app->request->post('name') | ||
| 44 | + && $this->validate(Yii::$app->request->post('name'), $this->pattern4Role) | ||
| 45 | + && $this->isUnique(Yii::$app->request->post('name'), 'role') | ||
| 46 | + ) { | ||
| 47 | + $role = Yii::$app->authManager->createRole(Yii::$app->request->post('name')); | ||
| 48 | + $role->description = Yii::$app->request->post('description'); | ||
| 49 | + Yii::$app->authManager->add($role); | ||
| 50 | + $this->setPermissions(Yii::$app->request->post('permissions', []), $role); | ||
| 51 | + return $this->redirect(Url::toRoute([ | ||
| 52 | + 'update-role', | ||
| 53 | + 'name' => $role->name | ||
| 54 | + ])); | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + $permissions = ArrayHelper::map(Yii::$app->authManager->getPermissions(), 'name', 'description'); | ||
| 58 | + return $this->render( | ||
| 59 | + 'addRole', | ||
| 60 | + [ | ||
| 61 | + 'permissions' => $permissions, | ||
| 62 | + 'error' => $this->error | ||
| 63 | + ] | ||
| 64 | + ); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + public function actionUpdateRole($name) | ||
| 68 | + { | ||
| 69 | + $role = Yii::$app->authManager->getRole($name); | ||
| 70 | + | ||
| 71 | + $permissions = ArrayHelper::map(Yii::$app->authManager->getPermissions(), 'name', 'description'); | ||
| 72 | + $role_permit = array_keys(Yii::$app->authManager->getPermissionsByRole($name)); | ||
| 73 | + | ||
| 74 | + if ($role instanceof Role) { | ||
| 75 | + if (Yii::$app->request->post('name') | ||
| 76 | + && $this->validate(Yii::$app->request->post('name'), $this->pattern4Role) | ||
| 77 | + ) { | ||
| 78 | + if (Yii::$app->request->post('name') != $name && !$this->isUnique(Yii::$app->request->post('name'), 'role')) { | ||
| 79 | + return $this->render( | ||
| 80 | + 'updateRole', | ||
| 81 | + [ | ||
| 82 | + 'role' => $role, | ||
| 83 | + 'permissions' => $permissions, | ||
| 84 | + 'role_permit' => $role_permit, | ||
| 85 | + 'error' => $this->error | ||
| 86 | + ] | ||
| 87 | + ); | ||
| 88 | + } | ||
| 89 | + $role = $this->setAttribute($role, Yii::$app->request->post()); | ||
| 90 | + Yii::$app->authManager->update($name, $role); | ||
| 91 | + Yii::$app->authManager->removeChildren($role); | ||
| 92 | + $this->setPermissions(Yii::$app->request->post('permissions', []), $role); | ||
| 93 | + return $this->redirect(Url::toRoute([ | ||
| 94 | + 'update-role', | ||
| 95 | + 'name' => $role->name | ||
| 96 | + ])); | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + return $this->render( | ||
| 100 | + 'updateRole', | ||
| 101 | + [ | ||
| 102 | + 'role' => $role, | ||
| 103 | + 'permissions' => $permissions, | ||
| 104 | + 'role_permit' => $role_permit, | ||
| 105 | + 'error' => $this->error | ||
| 106 | + ] | ||
| 107 | + ); | ||
| 108 | + } else { | ||
| 109 | + throw new BadRequestHttpException(Yii::t('db_rbac', 'Страница не найдена')); | ||
| 110 | + } | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + public function actionDeleteRole($name) | ||
| 114 | + { | ||
| 115 | + $role = Yii::$app->authManager->getRole($name); | ||
| 116 | + if ($role) { | ||
| 117 | + Yii::$app->authManager->removeChildren($role); | ||
| 118 | + Yii::$app->authManager->remove($role); | ||
| 119 | + } | ||
| 120 | + return $this->redirect(Url::toRoute(['role'])); | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + | ||
| 124 | + public function actionPermission() | ||
| 125 | + { | ||
| 126 | + return $this->render('permission'); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + public function actionAddPermission() | ||
| 130 | + { | ||
| 131 | + $permission = $this->clear(Yii::$app->request->post('name')); | ||
| 132 | + if ($permission | ||
| 133 | + && $this->validate($permission, $this->pattern4Permission) | ||
| 134 | + && $this->isUnique($permission, 'permission') | ||
| 135 | + ) { | ||
| 136 | + $permit = Yii::$app->authManager->createPermission($permission); | ||
| 137 | + $permit->description = Yii::$app->request->post('description', ''); | ||
| 138 | + Yii::$app->authManager->add($permit); | ||
| 139 | + return $this->redirect(Url::toRoute([ | ||
| 140 | + 'update-permission', | ||
| 141 | + 'name' => $permit->name | ||
| 142 | + ])); | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + return $this->render('addPermission', ['error' => $this->error]); | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + public function actionUpdatePermission($name) | ||
| 149 | + { | ||
| 150 | + $permit = Yii::$app->authManager->getPermission($name); | ||
| 151 | + if ($permit instanceof Permission) { | ||
| 152 | + $permission = $this->clear(Yii::$app->request->post('name')); | ||
| 153 | + if ($permission && $this->validate($permission, $this->pattern4Permission) | ||
| 154 | + ) { | ||
| 155 | + if($permission!= $name && !$this->isUnique($permission, 'permission')) | ||
| 156 | + { | ||
| 157 | + return $this->render('updatePermission', [ | ||
| 158 | + 'permit' => $permit, | ||
| 159 | + 'error' => $this->error | ||
| 160 | + ]); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + $permit->name = $permission; | ||
| 164 | + $permit->description = Yii::$app->request->post('description', ''); | ||
| 165 | + Yii::$app->authManager->update($name, $permit); | ||
| 166 | + return $this->redirect(Url::toRoute([ | ||
| 167 | + 'update-permission', | ||
| 168 | + 'name' => $permit->name | ||
| 169 | + ])); | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + return $this->render('updatePermission', [ | ||
| 173 | + 'permit' => $permit, | ||
| 174 | + 'error' => $this->error | ||
| 175 | + ]); | ||
| 176 | + } else throw new BadRequestHttpException(Yii::t('db_rbac', 'Страница не найдена')); | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + public function actionDeletePermission($name) | ||
| 180 | + { | ||
| 181 | + $permit = Yii::$app->authManager->getPermission($name); | ||
| 182 | + if ($permit) | ||
| 183 | + Yii::$app->authManager->remove($permit); | ||
| 184 | + return $this->redirect(Url::toRoute(['permission'])); | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + protected function setAttribute($object, $data) | ||
| 188 | + { | ||
| 189 | + $object->name = $data['name']; | ||
| 190 | + $object->description = $data['description']; | ||
| 191 | + return $object; | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + protected function setPermissions($permissions, $role) | ||
| 195 | + { | ||
| 196 | + foreach ($permissions as $permit) { | ||
| 197 | + $new_permit = Yii::$app->authManager->getPermission($permit); | ||
| 198 | + Yii::$app->authManager->addChild($role, $new_permit); | ||
| 199 | + } | ||
| 200 | + } | ||
| 201 | + | ||
| 202 | + protected function validate($field, $regex) | ||
| 203 | + { | ||
| 204 | + $validator = new RegularExpressionValidator(['pattern' => $regex]); | ||
| 205 | + if ($validator->validate($field, $error)) | ||
| 206 | + return true; | ||
| 207 | + else { | ||
| 208 | + $this->error[] = Yii::t('db_rbac', 'Значение "{field}" содержит не допустимые символы', ['field' => $field]); | ||
| 209 | + return false; | ||
| 210 | + } | ||
| 211 | + } | ||
| 212 | + | ||
| 213 | + protected function isUnique($name, $type) | ||
| 214 | + { | ||
| 215 | + if ($type == 'role') { | ||
| 216 | + $role = Yii::$app->authManager->getRole($name); | ||
| 217 | + if ($role instanceof Role) { | ||
| 218 | + $this->error[] = Yii::t('db_rbac', 'Роль с таким именем уже существует: ') . $name; | ||
| 219 | + return false; | ||
| 220 | + } else return true; | ||
| 221 | + } elseif ($type == 'permission') { | ||
| 222 | + $permission = Yii::$app->authManager->getPermission($name); | ||
| 223 | + if ($permission instanceof Permission) { | ||
| 224 | + $this->error[] = Yii::t('db_rbac', 'Правило с таким именем уже существует: ') . $name; | ||
| 225 | + return false; | ||
| 226 | + } else return true; | ||
| 227 | + } | ||
| 228 | + } | ||
| 229 | + | ||
| 230 | + protected function clear($value) | ||
| 231 | + { | ||
| 232 | + if (!empty($value)) { | ||
| 233 | + $value = trim($value, "/ \t\n\r\0\x0B"); | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + return $value; | ||
| 237 | + } | ||
| 238 | +} | ||
| 0 | \ No newline at end of file | 239 | \ No newline at end of file |
common/components/developeruz/db_rbac/controllers/UserController.php
0 → 100644
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * Controller to attache role for user for Yii2 | ||
| 4 | + * | ||
| 5 | + * @author Elle <elleuz@gmail.com> | ||
| 6 | + * @version 0.1 | ||
| 7 | + * @package UserController for Yii2 | ||
| 8 | + * | ||
| 9 | + */ | ||
| 10 | +namespace common\components\developeruz\db_rbac\controllers; | ||
| 11 | + | ||
| 12 | +use Yii; | ||
| 13 | +use yii\filters\VerbFilter; | ||
| 14 | +use yii\helpers\ArrayHelper; | ||
| 15 | +use yii\helpers\Url; | ||
| 16 | +use yii\web\Controller; | ||
| 17 | +use yii\web\BadRequestHttpException; | ||
| 18 | +use developeruz\db_rbac\interfaces\UserRbacInterface; | ||
| 19 | +use yii\web\NotFoundHttpException; | ||
| 20 | + | ||
| 21 | +class UserController extends Controller | ||
| 22 | +{ | ||
| 23 | + public $moduleName = 'permit'; | ||
| 24 | + | ||
| 25 | + public function beforeAction($action) | ||
| 26 | + { | ||
| 27 | + if(empty(Yii::$app->controller->module->params['userClass'])){ | ||
| 28 | + throw new BadRequestHttpException(Yii::t('db_rbac','Необходимо указать класс User в настройках модуля')); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + $user = new Yii::$app->controller->module->params['userClass'](); | ||
| 32 | + | ||
| 33 | + if(! $user instanceof UserRbacInterface) | ||
| 34 | + { | ||
| 35 | + throw new BadRequestHttpException(Yii::t('db_rbac', 'UserClass должен реализовывать интерфейс developeruz\db_rbac\UserRbacInterface')); | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + return parent::beforeAction($action); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + public function actions() | ||
| 42 | + { | ||
| 43 | + return [ | ||
| 44 | + 'error' => [ | ||
| 45 | + 'class' => 'yii\web\ErrorAction', | ||
| 46 | + ], | ||
| 47 | + ]; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + public function behaviors() | ||
| 51 | + { | ||
| 52 | + return [ | ||
| 53 | + 'verbs' => [ | ||
| 54 | + 'class' => VerbFilter::className(), | ||
| 55 | + 'actions' => [ | ||
| 56 | + 'update' => ['post'], | ||
| 57 | + '*' => ['get'], | ||
| 58 | + ], | ||
| 59 | + ], | ||
| 60 | + ]; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + public function actionView($id) | ||
| 64 | + { | ||
| 65 | + $roles = ArrayHelper::map(Yii::$app->authManager->getRoles(), 'name', 'description'); | ||
| 66 | + $user_permit = array_keys(Yii::$app->authManager->getRolesByUser($id)); | ||
| 67 | + $user = $this->findUser($id); | ||
| 68 | + return $this->render('view', [ | ||
| 69 | + 'user' => $user, | ||
| 70 | + 'roles' => $roles, | ||
| 71 | + 'user_permit' => $user_permit, | ||
| 72 | + 'moduleName' => Yii::$app->controller->module->id | ||
| 73 | + ]); | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + public function actionUpdate($id) | ||
| 77 | + { | ||
| 78 | + $user = $this->findUser($id); | ||
| 79 | + Yii::$app->authManager->revokeAll($user->getId()); | ||
| 80 | + if(Yii::$app->request->post('roles')){ | ||
| 81 | + foreach(Yii::$app->request->post('roles') as $role) | ||
| 82 | + { | ||
| 83 | + $new_role = Yii::$app->authManager->getRole($role); | ||
| 84 | + Yii::$app->authManager->assign($new_role, $user->getId()); | ||
| 85 | + } | ||
| 86 | + } | ||
| 87 | + return $this->redirect(Url::to(["/".Yii::$app->controller->module->id."/user/view", 'id' => $user->getId()])); | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + private function findUser($id) | ||
| 91 | + { | ||
| 92 | + $class = new Yii::$app->controller->module->params['userClass'](); | ||
| 93 | + $user = $class::findIdentity($id); | ||
| 94 | + if(empty($user)){ | ||
| 95 | + throw new NotFoundHttpException(Yii::t('db_rbac', 'Пользователь не найден')); | ||
| 96 | + } else { | ||
| 97 | + return $user; | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | +} | ||
| 0 | \ No newline at end of file | 101 | \ No newline at end of file |
common/components/developeruz/db_rbac/interfaces/UserRbacInterface.php
0 → 100644
common/components/developeruz/db_rbac/messages/en/db_rbac.php
0 → 100644
| 1 | +<?php | ||
| 2 | +return [ | ||
| 3 | + 'Правило с таким именем уже существует: ' => 'Permission with the same name already exists: ', | ||
| 4 | + 'Роль с таким именем уже существует: ' => 'Role with the same name already exists: ', | ||
| 5 | + 'Значение "{field}" содержит недопустимые символы' => '"{field}" value contains invalid characters', | ||
| 6 | + 'Страница не найдена' => 'Page not found', | ||
| 7 | + 'Недостаточно прав' => 'You not allow to access', | ||
| 8 | + 'Необходимо указать класс User в настройках модуля' => 'UserClass params must be set in config file', | ||
| 9 | + 'UserClass должен реализовывать интерфейс developeruz\db_rbac\UserRbacInterface' => 'UserClass must implements developeruz\db_rbac\UserRbacInterface', | ||
| 10 | + 'Пользователь не найден' => 'User not found' | ||
| 11 | +]; |
common/components/developeruz/db_rbac/views/access/addPermission.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\access; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\helpers\Html; | ||
| 6 | +use yii\widgets\ActiveForm; | ||
| 7 | + | ||
| 8 | +/* @var $this yii\web\View */ | ||
| 9 | +/* @var $model common\models\Links */ | ||
| 10 | +/* @var $form yii\widgets\ActiveForm */ | ||
| 11 | +$this->title = Yii::t('db_rbac', 'Новое правило'); | ||
| 12 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('db_rbac', 'Правила доступа'), 'url' => ['permission']]; | ||
| 13 | +$this->params['breadcrumbs'][] = Yii::t('db_rbac', 'Новое правило'); | ||
| 14 | +?> | ||
| 15 | +<div class="news-index"> | ||
| 16 | + | ||
| 17 | + <h1><?= Html::encode($this->title) ?></h1> | ||
| 18 | + | ||
| 19 | + <div class="links-form"> | ||
| 20 | + <?php | ||
| 21 | + if (!empty($error)) { | ||
| 22 | + ?> | ||
| 23 | + <div class="error-summary"> | ||
| 24 | + <?php | ||
| 25 | + echo implode('<br>', $error); | ||
| 26 | + ?> | ||
| 27 | + </div> | ||
| 28 | + <?php | ||
| 29 | + } | ||
| 30 | + ?> | ||
| 31 | + | ||
| 32 | + <?php $form = ActiveForm::begin(); ?> | ||
| 33 | + | ||
| 34 | + <div class="form-group"> | ||
| 35 | + <?= Html::label(Yii::t('db_rbac', 'Текстовое описание')); ?> | ||
| 36 | + <?= Html::textInput('description'); ?> | ||
| 37 | + </div> | ||
| 38 | + | ||
| 39 | + <div class="form-group"> | ||
| 40 | + <?= Html::label(Yii::t('db_rbac', 'Разрешенный доступ')); ?> | ||
| 41 | + <?= Html::textInput('name'); ?> | ||
| 42 | + <?=Yii::t('db_rbac', ' | ||
| 43 | + * Формат module/controller/action<br> | ||
| 44 | + site/article - доступ к странице site/article<br> | ||
| 45 | + site - доступ к любым action контроллера site');?> | ||
| 46 | + </div> | ||
| 47 | + | ||
| 48 | + <div class="form-group"> | ||
| 49 | + <?= Html::submitButton(Yii::t('db_rbac', 'Сохранить'), ['class' => 'btn btn-success']) ?> | ||
| 50 | + </div> | ||
| 51 | + | ||
| 52 | + <?php ActiveForm::end(); ?> | ||
| 53 | + | ||
| 54 | + </div> | ||
| 55 | +</div> |
common/components/developeruz/db_rbac/views/access/addRole.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\access; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\helpers\Html; | ||
| 6 | +use yii\widgets\ActiveForm; | ||
| 7 | + | ||
| 8 | +/* @var $this yii\web\View */ | ||
| 9 | +/* @var $model common\models\Links */ | ||
| 10 | +/* @var $form yii\widgets\ActiveForm */ | ||
| 11 | + | ||
| 12 | +$this->title = Yii::t('db_rbac', 'Новая роль'); | ||
| 13 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('db_rbac', 'Управление ролями'), 'url' => ['role']]; | ||
| 14 | +$this->params['breadcrumbs'][] = 'Новая роль'; | ||
| 15 | +?> | ||
| 16 | +<div class="news-index"> | ||
| 17 | + | ||
| 18 | + <h1><?= Html::encode($this->title) ?></h1> | ||
| 19 | + | ||
| 20 | + <div class="links-form"> | ||
| 21 | + <?php | ||
| 22 | + if (!empty($error)) { | ||
| 23 | + ?> | ||
| 24 | + <div class="error-summary"> | ||
| 25 | + <?php | ||
| 26 | + echo implode('<br>', $error); | ||
| 27 | + ?> | ||
| 28 | + </div> | ||
| 29 | + <?php | ||
| 30 | + } | ||
| 31 | + ?> | ||
| 32 | + <?php $form = ActiveForm::begin(); ?> | ||
| 33 | + | ||
| 34 | + <div class="form-group"> | ||
| 35 | + <?= Html::label(Yii::t('db_rbac', 'Название роли')); ?> | ||
| 36 | + <?= Html::textInput('name'); ?> | ||
| 37 | + * только латинские буквы, цифры и _ - | ||
| 38 | + </div> | ||
| 39 | + | ||
| 40 | + <div class="form-group"> | ||
| 41 | + <?= Html::label(Yii::t('db_rbac', 'Текстовое описание')); ?> | ||
| 42 | + <?= Html::textInput('description'); ?> | ||
| 43 | + </div> | ||
| 44 | + | ||
| 45 | + <div class="form-group"> | ||
| 46 | + <?= Html::label(Yii::t('db_rbac', 'Разрешенные доступы')); ?> | ||
| 47 | + <?= Html::checkboxList('permissions', null, $permissions, ['separator' => '<br>']); ?> | ||
| 48 | + </div> | ||
| 49 | + | ||
| 50 | + <div class="form-group"> | ||
| 51 | + <?= Html::submitButton(Yii::t('db_rbac', 'Сохранить'), ['class' => 'btn btn-success']) ?> | ||
| 52 | + </div> | ||
| 53 | + | ||
| 54 | + <?php ActiveForm::end(); ?> | ||
| 55 | + | ||
| 56 | + </div> | ||
| 57 | +</div> | ||
| 0 | \ No newline at end of file | 58 | \ No newline at end of file |
common/components/developeruz/db_rbac/views/access/permission.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\access; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\data\ArrayDataProvider; | ||
| 6 | +use yii\grid\GridView; | ||
| 7 | +use yii\grid\DataColumn; | ||
| 8 | +use yii\helpers\Url; | ||
| 9 | +use yii\helpers\Html; | ||
| 10 | + | ||
| 11 | +$this->title = Yii::t('db_rbac', 'Правила доступа'); | ||
| 12 | +$this->params['breadcrumbs'][] = $this->title; | ||
| 13 | +?> | ||
| 14 | +<div class="news-index"> | ||
| 15 | + | ||
| 16 | + <h1><?= Html::encode($this->title) ?></h1> | ||
| 17 | + | ||
| 18 | + <p> | ||
| 19 | + <?= Html::a(Yii::t('db_rbac', 'Добавить новое правило'), ['add-permission'], ['class' => 'btn btn-success']) ?> | ||
| 20 | + </p> | ||
| 21 | +<?php | ||
| 22 | +$dataProvider = new ArrayDataProvider([ | ||
| 23 | + 'allModels' => Yii::$app->authManager->getPermissions(), | ||
| 24 | + 'sort' => [ | ||
| 25 | + 'attributes' => ['name', 'description'], | ||
| 26 | + ], | ||
| 27 | + 'pagination' => [ | ||
| 28 | + 'pageSize' => 10, | ||
| 29 | + ], | ||
| 30 | + ]); | ||
| 31 | +?> | ||
| 32 | + | ||
| 33 | +<?=GridView::widget([ | ||
| 34 | + 'dataProvider' => $dataProvider, | ||
| 35 | + 'columns' => [ | ||
| 36 | + ['class' => 'yii\grid\SerialColumn'], | ||
| 37 | + [ | ||
| 38 | + 'class' => DataColumn::className(), | ||
| 39 | + 'attribute' => 'name', | ||
| 40 | + 'label' => Yii::t('db_rbac', 'Правило') | ||
| 41 | + ], | ||
| 42 | + [ | ||
| 43 | + 'class' => DataColumn::className(), | ||
| 44 | + 'attribute' => 'description', | ||
| 45 | + 'label' => Yii::t('db_rbac', 'Описание') | ||
| 46 | + ], | ||
| 47 | + ['class' => 'yii\grid\ActionColumn', | ||
| 48 | + 'template' => '{update} {delete}', | ||
| 49 | + 'buttons' => | ||
| 50 | + [ | ||
| 51 | + 'update' => function ($url, $model) { | ||
| 52 | + return Html::a('<span class="glyphicon glyphicon-pencil"></span>', Url::toRoute(['update-permission', 'name' => $model->name]), [ | ||
| 53 | + 'title' => Yii::t('yii', 'Update'), | ||
| 54 | + 'data-pjax' => '0', | ||
| 55 | + ]); }, | ||
| 56 | + 'delete' => function ($url, $model) { | ||
| 57 | + return Html::a('<span class="glyphicon glyphicon-trash"></span>', Url::toRoute(['delete-permission','name' => $model->name]), [ | ||
| 58 | + 'title' => Yii::t('yii', 'Delete'), | ||
| 59 | + 'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'), | ||
| 60 | + 'data-method' => 'post', | ||
| 61 | + 'data-pjax' => '0', | ||
| 62 | + ]); | ||
| 63 | + } | ||
| 64 | + ] | ||
| 65 | + ], | ||
| 66 | + ] | ||
| 67 | + ]); | ||
| 68 | +?> | ||
| 69 | +</div> | ||
| 0 | \ No newline at end of file | 70 | \ No newline at end of file |
common/components/developeruz/db_rbac/views/access/role.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\access; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\data\ArrayDataProvider; | ||
| 6 | +use yii\grid\GridView; | ||
| 7 | +use yii\grid\DataColumn; | ||
| 8 | +use yii\helpers\Url; | ||
| 9 | +use yii\helpers\Html; | ||
| 10 | +use yii\helpers\ArrayHelper; | ||
| 11 | + | ||
| 12 | +$this->title = Yii::t('db_rbac', 'Управление ролями'); | ||
| 13 | +$this->params['breadcrumbs'][] = $this->title; | ||
| 14 | +?> | ||
| 15 | +<div class="news-index"> | ||
| 16 | + | ||
| 17 | + <h1><?= Html::encode($this->title) ?></h1> | ||
| 18 | + | ||
| 19 | + <p> | ||
| 20 | + <?= Html::a(Yii::t('db_rbac', 'Добавить роль'), ['add-role'], ['class' => 'btn btn-success']) ?> | ||
| 21 | + </p> | ||
| 22 | +<?php | ||
| 23 | +$dataProvider = new ArrayDataProvider([ | ||
| 24 | + 'allModels' => Yii::$app->authManager->getRoles(), | ||
| 25 | + 'sort' => [ | ||
| 26 | + 'attributes' => ['name', 'description'], | ||
| 27 | + ], | ||
| 28 | + 'pagination' => [ | ||
| 29 | + 'pageSize' => 10, | ||
| 30 | + ], | ||
| 31 | + ]); | ||
| 32 | +?> | ||
| 33 | + | ||
| 34 | +<?=GridView::widget([ | ||
| 35 | + 'dataProvider' => $dataProvider, | ||
| 36 | + 'columns' => [ | ||
| 37 | + ['class' => 'yii\grid\SerialColumn'], | ||
| 38 | + [ | ||
| 39 | + 'class' => DataColumn::className(), | ||
| 40 | + 'attribute' => 'name', | ||
| 41 | + 'label' => Yii::t('db_rbac', 'Роль') | ||
| 42 | + ], | ||
| 43 | + [ | ||
| 44 | + 'class' => DataColumn::className(), | ||
| 45 | + 'attribute' => 'description', | ||
| 46 | + 'label' => Yii::t('db_rbac', 'Описание') | ||
| 47 | + ], | ||
| 48 | + [ | ||
| 49 | + 'class' => DataColumn::className(), | ||
| 50 | + 'label' => Yii::t('db_rbac', 'Разрешенные доступы'), | ||
| 51 | + 'format' => ['html'], | ||
| 52 | + 'value' => function($data) { return implode('<br>',array_keys(ArrayHelper::map(Yii::$app->authManager->getPermissionsByRole($data->name), 'description', 'description')));} | ||
| 53 | + ], | ||
| 54 | + ['class' => 'yii\grid\ActionColumn', | ||
| 55 | + 'template' => '{update} {delete}', | ||
| 56 | + 'buttons' => | ||
| 57 | + [ | ||
| 58 | + 'update' => function ($url, $model) { | ||
| 59 | + return Html::a('<span class="glyphicon glyphicon-pencil"></span>', Url::toRoute(['update-role', 'name' => $model->name]), [ | ||
| 60 | + 'title' => Yii::t('yii', 'Update'), | ||
| 61 | + 'data-pjax' => '0', | ||
| 62 | + ]); }, | ||
| 63 | + 'delete' => function ($url, $model) { | ||
| 64 | + return Html::a('<span class="glyphicon glyphicon-trash"></span>', Url::toRoute(['delete-role','name' => $model->name]), [ | ||
| 65 | + 'title' => Yii::t('yii', 'Delete'), | ||
| 66 | + 'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'), | ||
| 67 | + 'data-method' => 'post', | ||
| 68 | + 'data-pjax' => '0', | ||
| 69 | + ]); | ||
| 70 | + } | ||
| 71 | + ] | ||
| 72 | + ], | ||
| 73 | + ] | ||
| 74 | + ]); | ||
| 75 | +?> | ||
| 76 | +</div> | ||
| 0 | \ No newline at end of file | 77 | \ No newline at end of file |
common/components/developeruz/db_rbac/views/access/updatePermission.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\access; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\helpers\Html; | ||
| 6 | +use yii\widgets\ActiveForm; | ||
| 7 | + | ||
| 8 | +/* @var $this yii\web\View */ | ||
| 9 | +/* @var $model common\models\Links */ | ||
| 10 | +/* @var $form yii\widgets\ActiveForm */ | ||
| 11 | + | ||
| 12 | +$this->title = Yii::t('db_rbac', 'Редактирование правила: ') . ' ' . $permit->description; | ||
| 13 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('db_rbac', 'Правила доступа'), 'url' => ['permission']]; | ||
| 14 | +$this->params['breadcrumbs'][] = Yii::t('db_rbac', 'Редактирование правила'); | ||
| 15 | +?> | ||
| 16 | +<div class="news-index"> | ||
| 17 | + | ||
| 18 | + <h1><?= Html::encode($this->title) ?></h1> | ||
| 19 | + | ||
| 20 | + <div class="links-form"> | ||
| 21 | + | ||
| 22 | + <?php | ||
| 23 | + if (!empty($error)) { | ||
| 24 | + ?> | ||
| 25 | + <div class="error-summary"> | ||
| 26 | + <?php | ||
| 27 | + echo implode('<br>', $error); | ||
| 28 | + ?> | ||
| 29 | + </div> | ||
| 30 | + <?php | ||
| 31 | + } | ||
| 32 | + ?> | ||
| 33 | + | ||
| 34 | + <?php $form = ActiveForm::begin(); ?> | ||
| 35 | + | ||
| 36 | + <div class="form-group"> | ||
| 37 | + <?= Html::label(Yii::t('db_rbac', 'Текстовое описание')); ?> | ||
| 38 | + <?= Html::textInput('description', $permit->description); ?> | ||
| 39 | + </div> | ||
| 40 | + | ||
| 41 | + <div class="form-group"> | ||
| 42 | + <?= Html::label(Yii::t('db_rbac', 'Разрешенный доступ')); ?> | ||
| 43 | + <?= Html::textInput('name', $permit->name); ?> | ||
| 44 | + </div> | ||
| 45 | + | ||
| 46 | + <div class="form-group"> | ||
| 47 | + <?= Html::submitButton(Yii::t('db_rbac', 'Сохранить'), ['class' => 'btn btn-success']) ?> | ||
| 48 | + </div> | ||
| 49 | + | ||
| 50 | + <?php ActiveForm::end(); ?> | ||
| 51 | + | ||
| 52 | + </div> | ||
| 53 | +</div> | ||
| 0 | \ No newline at end of file | 54 | \ No newline at end of file |
common/components/developeruz/db_rbac/views/access/updateRole.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\access; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\helpers\Html; | ||
| 6 | +use yii\widgets\ActiveForm; | ||
| 7 | + | ||
| 8 | +$this->title = Yii::t('db_rbac', 'Редактирование роли: ') . ' ' . $role->name; | ||
| 9 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('db_rbac', 'Управление ролями'), 'url' => ['role']]; | ||
| 10 | +$this->params['breadcrumbs'][] = Yii::t('db_rbac', 'Редактирование'); | ||
| 11 | +?> | ||
| 12 | +<div class="news-index"> | ||
| 13 | + | ||
| 14 | + <h1><?= Html::encode($this->title) ?></h1> | ||
| 15 | + | ||
| 16 | + <div class="links-form"> | ||
| 17 | + | ||
| 18 | + <?php | ||
| 19 | + if (!empty($error)) { | ||
| 20 | + ?> | ||
| 21 | + <div class="error-summary"> | ||
| 22 | + <?php | ||
| 23 | + echo implode('<br>', $error); | ||
| 24 | + ?> | ||
| 25 | + </div> | ||
| 26 | + <?php | ||
| 27 | + } | ||
| 28 | + ?> | ||
| 29 | + | ||
| 30 | + <?php $form = ActiveForm::begin(); ?> | ||
| 31 | + | ||
| 32 | + <div class="form-group"> | ||
| 33 | + <?= Html::label(Yii::t('db_rbac', 'Название роли')); ?> | ||
| 34 | + <?= Html::textInput('name', $role->name); ?> | ||
| 35 | + </div> | ||
| 36 | + | ||
| 37 | + <div class="form-group"> | ||
| 38 | + <?= Html::label(Yii::t('db_rbac', 'Текстовое описание')); ?> | ||
| 39 | + <?= Html::textInput('description', $role->description); ?> | ||
| 40 | + </div> | ||
| 41 | + | ||
| 42 | + <div class="form-group"> | ||
| 43 | + <?= Html::label(Yii::t('db_rbac', 'Разрешенные доступы')); ?> | ||
| 44 | + <?= Html::checkboxList('permissions', $role_permit, $permissions, ['separator' => '<br>']); ?> | ||
| 45 | + </div> | ||
| 46 | + | ||
| 47 | + <div class="form-group"> | ||
| 48 | + <?= Html::submitButton(Yii::t('db_rbac', 'Сохранить'), ['class' => 'btn btn-success']) ?> | ||
| 49 | + </div> | ||
| 50 | + | ||
| 51 | + <?php ActiveForm::end(); ?> | ||
| 52 | + | ||
| 53 | + </div> | ||
| 54 | +</div> |
common/components/developeruz/db_rbac/views/user/view.php
0 → 100644
| 1 | +<?php | ||
| 2 | +namespace developeruz\db_rbac\views\user; | ||
| 3 | + | ||
| 4 | +use Yii; | ||
| 5 | +use yii\helpers\Html; | ||
| 6 | +use yii\widgets\ActiveForm; | ||
| 7 | + | ||
| 8 | +?> | ||
| 9 | +<h3><?=Yii::t('db_rbac', 'Управление ролями пользователя');?> <?= $user->getUserName(); ?></h3> | ||
| 10 | +<?php $form = ActiveForm::begin(['action' => ["/{$moduleName}/user/update", 'id' => $user->getId()]]); ?> | ||
| 11 | + | ||
| 12 | +<?= Html::checkboxList('roles', $user_permit, $roles, ['separator' => '<br>']); ?> | ||
| 13 | + | ||
| 14 | +<div class="form-group"> | ||
| 15 | + <?= Html::submitButton(Yii::t('db_rbac', 'Сохранить'), ['class' => 'btn btn-success']) ?> | ||
| 16 | +</div> | ||
| 17 | + | ||
| 18 | +<?php ActiveForm::end(); ?> | ||
| 19 | + |
common/config/main.php
| @@ -2,8 +2,8 @@ | @@ -2,8 +2,8 @@ | ||
| 2 | return [ | 2 | return [ |
| 3 | 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', | 3 | 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', |
| 4 | 'modules' => [ | 4 | 'modules' => [ |
| 5 | - 'permit' => [ | ||
| 6 | - 'class' => 'app\modules\db_rbac\Yii2DbRbac', | 5 | + 'permit' => [ |
| 6 | + 'class' => 'common\components\developeruz\db_rbac\Yii2DbRbac', | ||
| 7 | 'params' => [ | 7 | 'params' => [ |
| 8 | 'userClass' => 'common\models\User' | 8 | 'userClass' => 'common\models\User' |
| 9 | ] | 9 | ] |