Установка плагина управления пользователями CakeDC/users



Установка плагина CakeDC/users для своего приложения на базе фреймворка CakePHP, позволит вам решить целый рад вопросов, касающихся управления пользователями и их правами. А именно:

  • Регистрация пользователя;
  • Вход/выход;
  • Вход через социальные сети (Facebook, Twitter, Instagram, Google, Linkedin и т.д.);
  • Простая настройка системы контроля доступа RBAC с помощью https://github.com/CakeDC/auth;
  • Функция Запомнить меня (Cookie) на основе https://github.com/CakeDC/auth;
  • Управление профилем пользователя;
  • Административное управление.

Подготовка

Начнем с того, что установим копию актуальной версии фреймворка CakePHP (скелет вашего будущего приложения) в заранее подготовленную локальную папку, например mysite.loc. Для этого откройте командную строку и выполните команду:

composer self-update && composer create-project --prefer-dist cakephp/app mysite.loc

После установки заготовки приложения, запустите локальный сервер и убедитесь, что по адресу http://mysite.loc отображается стартовая страница кейка. Далее, в phpMyAdmin создайте пустую базу данных (например: mydatabase) и выполните подключение к ней приложения.

Установка плагина

Сразу отмечу, что в данной статье я расскажу, как выполнить базовую установку и настройку плагина CakeDC/users, чтобы вы поняли сам принцип действий. Более детальную его настройку, например, авторизацию через социальные сети, можно выполнить самостоятельно, ознакомившись с документацией, которая скачается вместе с кодом, либо размещенной на GitHub (CakeDC/users).

Итак, приступим. Находясь в корневой папке своего приложения, откройте командную строку и выполните следующую команду, которая установит плагин в папку \mysite.loc\vendor\cakedc\:

composer require cakedc/users

Далее, выполните подключение плагина в файле \mysite.loc\config\bootstrap.php:

Plugin::load('CakeDC/Users', ['routes' => true, 'bootstrap' => true]);

Создайте несколько таблиц в своей базе данных, для хранения учетных данных пользователей и токенов для функции входа через социальные сети. Для этого выполните следующий код в командной строке:

bin\cake migrations migrate -p CakeDC/Users

Теперь, перейдя по адресу http://mysite.loc/users/users/register вы можете зарегистрировать нового пользователя. Перед этим убедитесь, что ваш локальный сервер способен отправлять электронные письма, для получения ссылки активации аккаунта (у меня, например, настроен почтовый модуль Merkury, входящий в состав локального сервера XAMPP). Так же, можно воспользоваться консолью CakePHP и добавить пользователя из командной строки:

bin\cake users addSuperuser

Консоль кейка

Мы только что добавили нового суперпользователя, который получит полные права администратора в вашем приложении (реализацию данного разрешения вы можете посмотреть в классе \mysite.loc\vendor\cakedc\auth\src\Auth\SuperuserAuthorize.php). Так как пароль вновь созданного пользователя хеширован, вы можете, для получения доступа, произвести его сброс через отправку электронного сообщения на странице http://mysite.loc/users/users/request-reset-password, после чего установить новый пароль и войти в систему. Форму входа вы найдете по адресу http://mysite.loc/login. Посмотреть как реализованы другие маршруты плагина и добавить свои, можно в файле \mysite.loc\vendor\cakedc\users\config\routes.php.

Теперь у вас установлен плагин (CakeDC/Users) и имеется аккаунт суперадминистратора, которому предоставлены полные разрешения. Теперь пришло время попробовать настроить разрешения для других ролей, которые могут вам понадобиться.

Как добавить пользовательское разрешение

Сейчас авторизованный доступ распространяется на контроллеры самого плагина и не затрагивает контроллеров основной части нашего приложения, т.е., любой пользователь может беспрепятственно посетить главную страницу (http://mysite.loc), за формирование которой отвечает контроллер \mysite.loc\src\Controller\PagesController.php (экшен display). Для примера, давайте разрешим сюда доступ только авторизованным пользователям, и начнем с того, что загрузим компонент UsersAuth в контроллере \src\Controller\AppController.php.

public function initialize()
    {
        parent::initialize();
        //
        // ...
        //
        $this->loadComponent('CakeDC/Users.UsersAuth');
    }

По умолчанию CakeDC Users Plugin позволяет пользователям регистрироваться, назначая им role = 'user'. Вы можете изменить имя роли по умолчанию, присваиваемой новым пользователям, но пока мы оставим всё как есть.

Далее, создайте новый файл \src\config\permissions.php со следующим содержимым:

return [
        'Users.SimpleRbac.permissions' => [
            [
                'role' => 'user',
                'controller' => 'Pages',
                'action' => ['display'],
            ],
        ]
    ];

Выше мы создали свое первое правило, разрешающее пользователям с ролью, определенной как user, обращаться к действию /pages/display. Так же следует отметить, что вы можете использовать подстановочные знаки '*' и массивы для настройки соответствующих правил.

Отлично, теперь в приложении у вас есть механизм, управляющий пользователями и позволяющий регистрироваться, проверять электронную почту новых пользователей, выполнять вход в систему, изменять пароль, а также использовать куки для запоминания пользователя.

Принадлежность

А как насчет принадлежности статьи определенному пользователю? Имеется ввиду то, что, возможно, вам потребуется разрешить автору статьи редактировать его собственную запись. Спешу сообщить: это очень просто реализовать с помощью только что установленного плагина CakeDC/Users. Предположим, что у вас есть столбец user_id в вашей таблице статей, чтобы поддерживать связь Articles belongsTo Users. Все что вам нужно, это указать новое правило, чтобы разрешить редактирование статьи только её владельцу. Обновите файл permissions.php, добавив следующие (так же в массив ниже добавим несколько разрешений касательно контроллера пользователей плагина):

use Cake\ORM\TableRegistry;
use CakeDC\Auth\Auth\Rules\Owner;   

return [
    'Users.SimpleRbac.permissions' => [
        [
            'role' => 'user',
            'controller' => 'Pages',
            'action' => ['display'],
        ],
        
        [
            'role' => 'user',
            'controller' => 'Bookmarks',
            'action' => ['index', 'view', 'add']
        ],
        
        [
            'role' => 'user',
            'controller' => 'Bookmarks',
            'action' => ['edit', 'delete'],
            'allowed' => new Owner(),
        ],
        
        [
            'role' => '*',
            'plugin' => 'CakeDC/Users',
            'controller' => 'Users',
            'action' => ['logout'],
        ],
        
        [
            'role' => '*',
            'plugin' => 'CakeDC/Users',
            'controller' => 'Users',
            'action' => ['profile'],
            'allowed' => function (array $user, $role, \Cake\Http\ServerRequest $request) {
                $userId = \Cake\Utility\Hash::get($request->getAttribute('params'), 'pass.0');
                if (!empty($userId) && !empty($user)) {
                    return $userId === $user['id'];
                }

                return true;
            }
        ]
    ]
];

Выше мы дополнительно разрешили доступ к методу, отвечающему за выход из системы и прописали условия просмотра профиля (зарегистрированный пользователь с ролью user может просматривать только свой профиль).

Помощники UserHelper и AuthLinkHelper

Так же, не могу не отметить встроенные в плагин UserHelper и AuthLinkHelper. У помощников есть несколько методов, которые могут понадобиться, если вы хотите улучшить свои шаблоны и добавить некоторые функции (например функция приветствия) в приложение. Включить UserHelper и AuthLinkHelper очень просто, достаточно в файле src/view/AppView.php добавить следущее:

class AppView extends View
{
    public function initialize()
    {
        parent::initialize();
        $this->loadHelper('CakeDC/Users.User');
        $this->loadHelper('CakeDC/Users.AuthLink');
    }
}

Теперь в шаблонах вашего приложения можно использовать методы помощников. Например, помимо строки приветствия и выхода из системы, есть такой полезный метод, как RBAC link. Эта функция проверяет, есть ли у вас доступ к ссылке, и на основании этого отображает ее, либо не отображает. Ниже приведены примеры, которые вы можете вставить в файлы шаблонов:

$this->AuthLink->link('Добавить пользователя', ['plugin' => 'CakeDC/Users', 'controller' => 'Users', 'action' => 'add']); //если пользователь имеет права доступа к указанному методу контроллера, то ссылка будет отображена
$this->User->welcome(); //приветствие пользователя
$this->User->logout('Выход'); //ссылка на выход из системы

Заключение

Параллельно, с написанием данного материала, я последовательно создавал пример. Если вы в чем-то не разобрались, то можете скачать исходники приложения на базе CakePHP 3, в котором установлен и используется плагин CakeDC Users с моей странички на GitHub к себе в локальную папку, создать базу данных и во всем разобраться на действующем примере.

.