Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Права доступа и токен пользователя

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

Группы пользователей

Группы редактируют в 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, измените свою группу и отметьте новый маршрут в обоих списках.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.