Групповая политика в приложении отличается от традиционного контроля доступа на основе ролей (RBAC) доступной “из коробки” в фреймворке Yii2 только разделением разрешений (permissions) на два вида:
Для того, чтобы отделить маршруты от обычных разрешений, система парсит поле name разрешения на предмет выявления следующего шаблона:
{app_id}:/{module_id}/{controller_id}/{action_id}
Если разрешение не удовлетворяет следующему шаблону, оно расценивается как “традиционное” разрешение.
Вместо action_id может быть указан символ * (звездочка), что будет предоставлять доступ ко всем экшенам указанного контроллера. Например:
{app_id}:/{module_id}/{controller_id}/*
{app_id}:/{controller_id}/*
В качестве controller_id также можно указывать символ * (звездочка), что будет предоставлять доступ ко всем контроллерам и экшенам указанного модуля либо, если не указан модуль, то приложения. Например:
{app_id}:/{module_id}/*
{app_id}:/*
Если вместо controller_id указан символ * (звездочка), не стоит указывать /{action_id} после него. Тоже самое касается и module_id. Если вместо module_id указан символ * (звездочка), не стоит указывать /{controller_id}/{action_id} после него. Например, следующие записи не будут расценены как маршруты:
- {app_id}:/{module_id}/*/{action_id}
- {app_id}:/*/{controller_id}/{action_id}
- {app_id}:/*/*/{action_id}
У каждой роли есть свой вес, который задает иерархию ролей. Если роль пользователя имеет доступ в раздел “Список пользователей” (/users/user/manage), то такой роли не будут видны пользователи с весом роли >= текущего веса роли пользователя. Это означает, что и другим пользователям текущий пользователь не сможет назначить роль с весом >= своего.
Обратите внимание на то, что вес роли задается в поле data в виде сериализованного массива с помощью метода serialize с ключем weight. Например:
class m181213_115448_update_permission extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 200])], ['name' => 'Developer']);
$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 100])], ['name' => 'Admin']);
$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 20])], ['name' => 'Moderator']);
$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 10])], ['name' => 'Operator']);
$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 5])], ['name' => 'User']);
$this->update('{{%auth_item}}', ['data' => serialize(['weight' => 0])], ['name' => 'Guest']);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->update('{{%auth_item}}', ['data' => null], ['name' => ['Developer', 'Admin', 'Moderator', 'Operator', 'User', 'Guest']]);
}
}
Изменение групповой политики производится только с помощью миграций. Например:
class m181109_170606_update_permission extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->insert('{{%auth_item}}', [
'name' => 'backend:/content/post/*',
'type' => Item::TYPE_PERMISSION
]);
$this->insert('{{%auth_item}}', [
'name' => 'backend:/content/category/*',
'type' => Item::TYPE_PERMISSION
]);
$this->insert('{{%auth_item_child}}', [
'parent' => 'Admin',
'child' => 'backend:/content/post/*'
]);
$this->insert('{{%auth_item_child}}', [
'parent' => 'Admin',
'child' => 'backend:/content/category/*'
]);
$this->insert('{{%auth_item}}', [
'name' => 'backend:/content/block/*',
'type' => Item::TYPE_PERMISSION
]);
$this->insert('{{%auth_item}}', [
'name' => 'content.blockFullUpdate',
'type' => Item::TYPE_PERMISSION
]);
$this->insert('{{%auth_item_child}}', [
'parent' => 'Admin',
'child' => 'backend:/content/block/*'
]);
$this->insert('{{%auth_item_child}}', [
'parent' => 'Developer',
'child' => 'content.blockFullUpdate'
]);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->delete('{{%auth_item_child}}', [
'parent' => 'Developer',
'child' => 'content.blockFullUpdate'
]);
$this->delete('{{%auth_item_child}}', [
'parent' => 'Admin',
'child' => 'backend:/content/block/*'
]);
$this->delete('{{%auth_item}}', [
'name' => 'content.blockFullUpdate',
'type' => Item::TYPE_PERMISSION
]);
$this->delete('{{%auth_item}}', [
'name' => 'backend:/content/block/*',
'type' => Item::TYPE_PERMISSION
]);
$this->delete('{{%auth_item_child}}', [
'parent' => 'Admin',
'child' => 'backend:/content/category/*'
]);
$this->delete('{{%auth_item_child}}', [
'parent' => 'Admin',
'child' => 'backend:/content/post/*'
]);
$this->delete('{{%auth_item}}', [
'name' => 'backend:/content/category/*',
'type' => Item::TYPE_PERMISSION
]);
$this->delete('{{%auth_item}}', [
'name' => 'backend:/content/post/*',
'type' => Item::TYPE_PERMISSION
]);
}
}
Не забывайте реализовывать метод down или safeDown миграции.
В случае изменения групповой политики в приложении нельзя изменять ранее примененную миграцию. Для внесения изменений в структуру базы данных необходимо создать новую миграцию.
Роль | Наименование роли | Описание | Вес |
---|---|---|---|
Developer | Разработчик | Роль имеет полный доступ. Не рекомендуется предоставлять клиенту. При установке системы создается один пользователь с ролью “Разработчик”:
После сдачи проекта клиенту желательно удалить аккаунт Разработчика. |
200 |
Admin | Администратор | Роль предназначена для клиентского аккаунта, имеет доступ практически во все разделы, за исключением разделов для разработчика (например, не предоставляется доступ к “Типы контента” в модуле “Контент”, “Модули” и т.д). | 100 |
Moderator | Модератор | Имеет доступ к модулю “Контент”, “Тикеты”. | 20 |
User | Пользователь | Присваивается зарегистрированному пользователю. | 5 |
Guest | Гость | Роль, которая присваивается всем пользователям без исключения (указана в defaultRoles). | 0 |
В зависимости от задач и архитектуры разрабатываемого приложения может потребоваться изменить стандартную авторизацию. Ниже рассмотрены примеры, которые помогут вам сориентироваться в решении нетривиальных задач.
При регистрации пользователю назначается роль по умолчанию, которая задается в common\modules\users\businness\UserCreator
.
В некоторых решениях требуется отключить регистрацию и сброс пароля для пользователей и оставить только регистрацию новых пользователей через Панель управления. Для этого необходимо отключить необходимые экшены (actions) в контроллере. common\modules\users\controllers\backend\DefaultController
в методе actions()
.
public function actions()
{
return [
'logout' => [
'class' => 'common\modules\users\actions\LogoutAction',
'redirectUrl' => '@public'
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'foreColor' => 0x79C137
],
'login-lock-reset' => [
'class' => 'common\modules\users\actions\LoginLockResetAction'
],
'register' => [
'class' => 'common\modules\users\actions\RegisterAction'
],
'login' => [
'class' => 'common\modules\users\actions\LoginAction'
],
'email-accept' => [
'class' => 'common\modules\users\actions\EmailAcceptAction'
],
'request-password-reset' => [
'class' => 'common\modules\users\actions\RequestPasswordResetAction'
],
'reset-password' => [
'class' => 'common\modules\users\actions\ResetPasswordAction'
],
'resend-email-accept' => [
'class' => 'common\modules\users\actions\ResendEmailAcceptAction'
]
];
}
Помимо этого необходимо скрыть ссылки из представления common/modules/users/views/default/login.php
и других, в которых встречаются ссылки на вышеупомянутые экшны за исключением reset-password. Ссылка на этот экшн формируется в ходе отправки письма после отправки формы на странице запроса на восстановления пароля (request-password-reset).
В платформе TaskOn предусмотрен функционал сброса пароля по двум бизнес-процессам:
Подробное описание бизнес-процессов приведено в Руководстве пользователя в разделе “Регистрация пользователей”.
По умолчанию в платформе активирован первый способ восстановления пароля.
Для изменения конфигурации нужно изменить класс для действия (action) reset-password c common\modules\users\actions\ChangePasswordAction
на common\modules\users\actions\ResetPasswordAction
контроллера common\modules\users\controllers\backend\DefaultController
.
Для того, чтобы мы смогли Вам предоставить доступ расскажите немного о себе
Опишите в форме ниже задачу, которую требуется реализовать.