Права доступа и токен пользователя
Панелью пользуются несколько человек: владелец, менеджер, редактор. Каждый сотрудник входит в группу пользователей, а группа определяет, какие страницы можно открывать и на каких можно менять данные. Кроме того, в каждом адресе панели есть секретный токен. Ваш контроллер должен учитывать и то и другое.
Группы пользователей
Группы редактируют в System → Users → User Groups. У каждой группы два списка маршрутов:
| Список | Что разрешает |
|---|---|
| Access Permission | Открывать страницу |
| Modify Permission | Сохранять, удалять, устанавливать |
Маршрут в этих списках — путь контроллера: extension/acme_hello/module/acme_hello.
Право access движок проверяет сам, когда страницу открывают. Право modify проверяет ваш код.
Проверка modify
Добавьте проверку в метод save() из прошлого урока:
// extension/acme_hello/admin/controller/module/acme_hello.php
public function save(): void
{
$this->load->language('extension/acme_hello/module/acme_hello');
$json = [];
if (!$this->user->hasPermission('modify', 'extension/acme_hello/module/acme_hello')) {
$json['error'] = $this->language->get('error_permission');
}
if (!$json) {
$this->load->model('setting/setting');
$this->model_setting_setting->editSetting('module_acme_hello', $this->request->post);
$json['success'] = $this->language->get('text_success');
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}Уберите маршрут из списка Modify Permission своей группы и нажмите сохранение на странице настроек — появится красное сообщение с текстом error_permission, и ничего не сохранится.
Объект user
$this->user — вошедший сотрудник. Он есть только в панели.
| Метод | Что возвращает |
|---|---|
isLogged() | Вошёл ли сотрудник |
getId() | Идентификатор сотрудника |
getUserName() | Логин |
getGroupId() | Идентификатор группы |
hasPermission($type, $route) | Есть ли у группы право |
Токен пользователя
После входа панель создаёт случайную строку и хранит её в сессии. Она должна быть в каждом адресе панели:
admin/index.php?route=extension/acme_hello/module/acme_hello&user_token=3f9a...Запрос без токена или с неверным токеном отправляется на страницу входа. Это защита от подделки запросов: чужой сайт не может заставить браузер сотрудника вызвать адрес панели, потому что не знает токен.
Поэтому каждая ссылка, которую строит контроллер панели, содержит токен:
$token = 'user_token=' . $this->session->data['user_token'];
$data['back'] = $this->url->link('marketplace/extension', $token . '&type=module');Частая ошибка
В установленное дополнение добавляют второй контроллер, например extension/acme_hello/admin/controller/module/callback.php, и его страница отвечает «Permission Denied». Права выдаются при установке только тем маршрутам, которые тогда существовали. Откройте System → Users → User Groups, измените свою группу и отметьте новый маршрут в обоих списках.