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 | ] |