Главная | Документаци для разраотчиков | Групповая политика - доступ к модулям TaskOn 2

Групповая политика - доступ к модулям TaskOn 2

Групповая политика в приложении отличается от традиционного контроля доступа на основе ролей (RBAC) доступной “из коробки” в фреймворке Yii2 только разделением разрешений (permissions) на два вида:

  • “традиционное” разрешение;
  • маршрут.

Для того, чтобы отделить маршруты от обычных разрешений, система парсит поле name разрешения на предмет выявления следующего шаблона:

{app_id}:/{module_id}/{controller_id}/{action_id}

  • app_id - ID приложения.
  • module_id - ID модуля. Не обязателен.
  • controller_id - ID контроллера.
  • action_id - 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. Например:

  1. class m181213_115448_update_permission extends Migration
  2. {
  3. /**
  4. * {@inheritdoc}
  5. */
  6. public function safeUp()
  7. {
  8. $this->update('{{%auth_item}}', ['data' => serialize(['weight' => 200])], ['name' => 'Developer']);
  9. $this->update('{{%auth_item}}', ['data' => serialize(['weight' => 100])], ['name' => 'Admin']);
  10. $this->update('{{%auth_item}}', ['data' => serialize(['weight' => 20])], ['name' => 'Moderator']);
  11. $this->update('{{%auth_item}}', ['data' => serialize(['weight' => 10])], ['name' => 'Operator']);
  12. $this->update('{{%auth_item}}', ['data' => serialize(['weight' => 5])], ['name' => 'User']);
  13. $this->update('{{%auth_item}}', ['data' => serialize(['weight' => 0])], ['name' => 'Guest']);
  14. }
  15. /**
  16. * {@inheritdoc}
  17. */
  18. public function safeDown()
  19. {
  20. $this->update('{{%auth_item}}', ['data' => null], ['name' => ['Developer', 'Admin', 'Moderator', 'Operator', 'User', 'Guest']]);
  21. }
  22. }

Изменение групповой политики

Изменение групповой политики производится только с помощью миграций. Например:

  1. class m181109_170606_update_permission extends Migration
  2. {
  3. /**
  4. * {@inheritdoc}
  5. */
  6. public function safeUp()
  7. {
  8. $this->insert('{{%auth_item}}', [
  9. 'name' => 'backend:/content/post/*',
  10. 'type' => Item::TYPE_PERMISSION
  11. ]);
  12. $this->insert('{{%auth_item}}', [
  13. 'name' => 'backend:/content/category/*',
  14. 'type' => Item::TYPE_PERMISSION
  15. ]);
  16. $this->insert('{{%auth_item_child}}', [
  17. 'parent' => 'Admin',
  18. 'child' => 'backend:/content/post/*'
  19. ]);
  20. $this->insert('{{%auth_item_child}}', [
  21. 'parent' => 'Admin',
  22. 'child' => 'backend:/content/category/*'
  23. ]);
  24. $this->insert('{{%auth_item}}', [
  25. 'name' => 'backend:/content/block/*',
  26. 'type' => Item::TYPE_PERMISSION
  27. ]);
  28. $this->insert('{{%auth_item}}', [
  29. 'name' => 'content.blockFullUpdate',
  30. 'type' => Item::TYPE_PERMISSION
  31. ]);
  32. $this->insert('{{%auth_item_child}}', [
  33. 'parent' => 'Admin',
  34. 'child' => 'backend:/content/block/*'
  35. ]);
  36. $this->insert('{{%auth_item_child}}', [
  37. 'parent' => 'Developer',
  38. 'child' => 'content.blockFullUpdate'
  39. ]);
  40. }
  41. /**
  42. * {@inheritdoc}
  43. */
  44. public function safeDown()
  45. {
  46. $this->delete('{{%auth_item_child}}', [
  47. 'parent' => 'Developer',
  48. 'child' => 'content.blockFullUpdate'
  49. ]);
  50. $this->delete('{{%auth_item_child}}', [
  51. 'parent' => 'Admin',
  52. 'child' => 'backend:/content/block/*'
  53. ]);
  54. $this->delete('{{%auth_item}}', [
  55. 'name' => 'content.blockFullUpdate',
  56. 'type' => Item::TYPE_PERMISSION
  57. ]);
  58. $this->delete('{{%auth_item}}', [
  59. 'name' => 'backend:/content/block/*',
  60. 'type' => Item::TYPE_PERMISSION
  61. ]);
  62. $this->delete('{{%auth_item_child}}', [
  63. 'parent' => 'Admin',
  64. 'child' => 'backend:/content/category/*'
  65. ]);
  66. $this->delete('{{%auth_item_child}}', [
  67. 'parent' => 'Admin',
  68. 'child' => 'backend:/content/post/*'
  69. ]);
  70. $this->delete('{{%auth_item}}', [
  71. 'name' => 'backend:/content/category/*',
  72. 'type' => Item::TYPE_PERMISSION
  73. ]);
  74. $this->delete('{{%auth_item}}', [
  75. 'name' => 'backend:/content/post/*',
  76. 'type' => Item::TYPE_PERMISSION
  77. ]);
  78. }
  79. }

Не забывайте реализовывать метод down или safeDown миграции.

В случае изменения групповой политики в приложении нельзя изменять ранее примененную миграцию. Для внесения изменений в структуру базы данных необходимо создать новую миграцию.

Список ролей по умолчанию

Роль Наименование роли Описание Вес
Developer Разработчик Роль имеет полный доступ. Не рекомендуется предоставлять клиенту. При установке системы создается один пользователь с ролью “Разработчик”:
  • Логин - admin@task-on.com
  • Пароль - 123456
При разворачивании проекта на удаленном сервере обязательно сменить пароль!
После сдачи проекта клиенту желательно удалить аккаунт Разработчика.
200
Admin Администратор Роль предназначена для клиентского аккаунта, имеет доступ практически во все разделы, за исключением разделов для разработчика (например, не предоставляется доступ к “Типы контента” в модуле “Контент”, “Модули” и т.д). 100
Moderator Модератор Имеет доступ к модулю “Контент”, “Тикеты”. 20
User Пользователь Присваивается зарегистрированному пользователю. 5
Guest Гость Роль, которая присваивается всем пользователям без исключения (указана в defaultRoles). 0

Настройка данных при регистрации и авторизации

В зависимости от задач и архитектуры разрабатываемого приложения может потребоваться изменить стандартную авторизацию. Ниже рассмотрены примеры, которые помогут вам сориентироваться в решении нетривиальных задач.

Форма регистрации

При регистрации пользователю назначается роль по умолчанию, которая задается в common\modules\users\businness\UserCreator.

В некоторых решениях требуется отключить регистрацию и сброс пароля для пользователей и оставить только регистрацию новых пользователей через Панель управления. Для этого необходимо отключить необходимые экшены (actions) в контроллере. common\modules\users\controllers\backend\DefaultController в методе actions().

  1. public function actions()
  2. {
  3. return [
  4. 'logout' => [
  5. 'class' => 'common\modules\users\actions\LogoutAction',
  6. 'redirectUrl' => '@public'
  7. ],
  8. 'captcha' => [
  9. 'class' => 'yii\captcha\CaptchaAction',
  10. 'foreColor' => 0x79C137
  11. ],
  12. 'login-lock-reset' => [
  13. 'class' => 'common\modules\users\actions\LoginLockResetAction'
  14. ],
  15. 'register' => [
  16. 'class' => 'common\modules\users\actions\RegisterAction'
  17. ],
  18. 'login' => [
  19. 'class' => 'common\modules\users\actions\LoginAction'
  20. ],
  21. 'email-accept' => [
  22. 'class' => 'common\modules\users\actions\EmailAcceptAction'
  23. ],
  24. 'request-password-reset' => [
  25. 'class' => 'common\modules\users\actions\RequestPasswordResetAction'
  26. ],
  27. 'reset-password' => [
  28. 'class' => 'common\modules\users\actions\ResetPasswordAction'
  29. ],
  30. 'resend-email-accept' => [
  31. 'class' => 'common\modules\users\actions\ResendEmailAcceptAction'
  32. ]
  33. ];
  34. }
  • register - экшн регистрации.
  • request-password-reset - страница запроса на восстановление пароля.
  • reset-password - подтверждение восстановления пароля.

Помимо этого необходимо скрыть ссылки из представления common/modules/users/views/default/login.php и других, в которых встречаются ссылки на вышеупомянутые экшны за исключением reset-password. Ссылка на этот экшн формируется в ходе отправки письма после отправки формы на странице запроса на восстановления пароля (request-password-reset).

Форма восстановления пароля

В платформе TaskOn предусмотрен функционал сброса пароля по двум бизнес-процессам:

  • Пользователь самостоятельно задает новый пароль через форму.
  • Пароль генерируется автоматически системой по запросу и отправляется на e-mail.

Подробное описание бизнес-процессов приведено в Руководстве пользователя в разделе “Регистрация пользователей”.

По умолчанию в платформе активирован первый способ восстановления пароля.
Для изменения конфигурации нужно изменить класс для действия (action) reset-password c common\modules\users\actions\ChangePasswordAction на common\modules\users\actions\ResetPasswordAction
контроллера common\modules\users\controllers\backend\DefaultController.