b0f143c3
Yarik
first commit
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
Динамическая настройка прав доступа для Yii2
============
Модуль для создания ролей и прав доступа через веб-интерфейс, так же имеющий веб интерфейс для назначения ролей пользователям
Поведение для приложения, проверяющее право доступа к action по внесенным в модуле правилам.
###Установка:###
```bash
$ php composer.phar require developeruz/yii2-db-rbac "*"
```
Для корректной работы модуля необходимо настроить authManager в конфиге приложения (common/config/main.php для advanced или config/web.php и config/console для basic приложения)
```php
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
...
]
```
И выполнить миграции, создающие таблицы для DbManager (подразумевается, что коннект к БД для приложения уже настроен)
```bash
$ yii migrate --migrationPath=@yii/rbac/migrations/
```
##Подключение модуля##
В конфиге приложения (backend/config/main.php для advanced или config/web.php для basic приложения) прописываем модуль
```php
'modules' => [
'permit' => [
'class' => 'developeruz\db_rbac\Yii2DbRbac',
],
],
```
Если нужно передать layout это можно сделать так:
```php
'modules' => [
'permit' => [
'class' => 'developeruz\db_rbac\Yii2DbRbac',
'layout' => '//admin'
],
],
```
Если вы используете ЧПУ, то убедитесь что у вас прописаны правила роутинга для модулей
```php
'<module:\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>',
'<module:\w+>/<controller:\w+>/<action:(\w|-)+>/<id:\d+>' => '<module>/<controller>/<action>',
```
**Добавляем ссылки в меню**
**/permit/access/role - управление ролями**
**/permit/access/permission - управление правами доступа**
###Назначение ролей пользователям###
По многочисленным просьбам в модуль добавлен интерфейс для назначения ролей пользователям.
Для корректной работы модуля нужно указать в параметрах модуля класс `User`.
```php
'modules' => [
'permit' => [
'class' => 'app\modules\db_rbac\Yii2DbRbac',
'params' => [
'userClass' => 'app\models\User'
]
],
],
```
Класс User должен реализовывать интерфейс `developeruz\db_rbac\interfaces\UserRbacInterface`.
В большинстве случаев придется дописать в нем 1 функцию `getUserName()` которая будет возвращать отображаемое имя пользователя.
```php
use developeruz\db_rbac\interfaces\UserRbacInterface;
class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
{
...
public function getUserName()
{
return $this->username;
}
}
```
**Управление ролью пользователя происходит на странице `/permit/user/view/1` для пользователя с id=1.**
Удобнее всего дописать кнопку на эту страницу в Grid со списком пользователей.
```php
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'username',
'email:email',
['class' => 'yii\grid\ActionColumn',
'template' => '{view} {update} {permit} {delete}',
'buttons' =>
[
'permit' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-wrench"></span>', Url::to(['/permit/user/view', 'id' => $model->id]), [
'title' => Yii::t('yii', 'Change user role')
]); },
]
],
],
]);
```
Присвоить роль пользователю можно и в коде, например при создании нового пользователя.
```php
$userRole = Yii::$app->authManager->getRole('name_of_role');
Yii::$app->authManager->assign($userRole, $user->getId());
```
Проверить, имеет ли пользователь право на действие можно через метод `can()` компонента User
```php
Yii::$app->user->can($permissionName);
```
$permissionName - может быть как ролью так и правом
##Поведение, динамически проверяющее наличие прав##
Данное поведение позволяет не писать Yii::$app->user->can($permissionName); в каждом action, а проверять права доступа на лету.
Это удобно для гибкой настройки прав при использовании сторонних модулей.
###Подключение поведения###
В конфиге того приложения, доступ к которому следует проверять на лету, необходимо подключить поведение
```php
use developeruz\db_rbac\behaviors\AccessBehavior;
'as AccessBehavior' => [
'class' => AccessBehavior::className(),
]
```
С этого момента, после обработки запроса (событие EVENT_AFTER_REQUEST) проверяются права текущего пользователя (Yii::$app->user) на выполнение запрашиваемого действия (Yii::$app->user->can())
Действие считается разрешенным, если:
- пользователю разрешен доступ к конкретному action (правило записано как: module/controller/action)
- пользователю разрешен доступ к любым action данного контроллера (правило записано как: module/controller)
- пользователю разрешен доступ к любым action данного модуля (правило записано как: module)
###Настройка прав доступа по умолчанию###
После подключения поведения, доступ становится возможен только авторизованному пользователю, имеющему некие права.
Для исключений из этого правила можно прописать доступы по умолчанию в том же формате AccessControl, что и в контроллере:
```php
'as AccessBehavior' => [
'class' => AccessBehavior::className(),
'rules' =>
['site' =>
[
[
'actions' => ['login', 'index'],
'allow' => true,
],
[
'actions' => ['about'],
'allow' => true,
'roles' => ['admin'],
],
]
]
]
```
В приведенном выше примере разрешен доступ любому пользователю к site/login и site/index и доступ пользователя с ролью admin к site/about
Правила прописанные в конфиге имеют приоритет над динамически настраиваемыми правилами.
|