Компонент предоставляет возможности регистрации, аутентификации (в том числе через сторонние сервисы), учета пользователей, разграничения их прав.
Страницы контроллера
Сразу после установки компонента доступны следующие страницы:
- /users/registration/ - страница регистрации
- /users/login/ - страница с формой входа на сайт
- /users/logout/ - выход из учетной записи
- /users/home/ - личный кабинет
- /users/genpassword/ - восстановление пароля
- /users/newemail/ - новый email
- /users/avatar/ - загрузка, смена аватара
Регистрация
Форма регистрации состоит из двух групп полей - поля с основными данными(имя, логин, пароль, email) и поля с анкетными данными (по умолчанию - пол, дата рождения, город). Поля из первой группы являются обязательными для заполнения и играют важную роль в логике работы контроллера. Не позволяется использовать уже существующие в таблице логин, пароль и имя. Имя дополнительно проверяется на схожесть с уже существующими именами(например luk и 1uk) и при нахождении такого соответствия выдается сообщение с просьбой сменить имя. Для этого используется генерируемое поле name_base. Так как для каждого отдельного сайта могут понадобится совершенно различные данные о пользователе, то полями в анкетных данных можно управлять.
Добавление поля в анкетные данные
Для добавления нового пункта в анкету необходимо добавить соответствующее поле в таблицу БД users через настройку schema(./config/schema.php). После чего добавить поле для редактирования через настройку questionnaire.php. В качестве полей используются CMS.Fields и используется соответствующий набор типов полей и настроек. Поле станет доступно для заполнения в форме регистрации и редактирования в личном кабинете.
После регистрации
После регистрации, пользователю отправляется письмо с ссылкой на подтверждение регистрации. При попытке зайти на сайт с логином и паролем от неподтвержденного аккаунта, на email аккаунта отправляется дублирующее письмо с ссылкой на подтверждение, и входа не происходит.
Вход на сайт
Контроллер по умолчанию предоставляет страницу с формой входа на сайт. Для вывода формы входа(как и других форм компонента) в другом месте сейчас можно использовать объект CMS::objects()->users_forms. Получение формы для входа выглядит так:
// данный метод вернет объект класса Forms_Form, который будем использовать для вывода формы.
CMS::objects()->users_forms->login()
В компоненте есть возможность использовать сторонние сервисы для входа на сайт с помощью механизмов openid и oauth. Настройка провайдеров сторонней аутентификации осуществляется в ./config/providers.php
OpenID
По умолчанию включены следующие сервисы - google, yandex, yahoo, livejournal, mail.ru. Чтобы добавить новый сервис, добавляем новую запись в массив с индексом openid и создаем иконку с соответствующим именем в папке /images/logos32x32(или можно указать адрес картинки в параметре image). Для настройки простейшего сервиса достаточно указать только соответствующий url, например:
'google' => 'https://www.google.com/accounts/o8/id'
Если для формирования url необходимы дополнительные параметры, то используем параметр ask:
// простой пример, для формирования url нам нужен только логин пользователя в livejournal 'livejournal' => array( 'url' => 'http://{ask_name}.livejournal.com', // в качестве шаблона для замены используем {ask_имя_поля} 'ask' => array( 'name' => 'Ваш логин в ЖЖ:', // краткая запись поля, ключ - название поля, значение - заголовок. Будет выведен этот заголовок с текстовым полем для ввода ) ), // для url нужны уже два параметра - имя пользователя и домен 'mailru' => array( 'url' => 'http://{ask_name}.id.{ask_domain}', 'ask' => array( // текстовое поле 'name' => 'Ваш адрес:', // поле с выпадающим списком 'domain' => array( 'caption' => '@', 'select' => array( 'mail.ru' => 'mail.ru', 'inbox.ru' => 'inbox.ru', 'bk.ru' => 'bk.ru', 'list.ru' => 'list.ru', ) ) ) ),
OAuth
Настройка данного механизма несколько сложнее. Сложность заключается в том, что нам необходимо получить параметры key и secret, необходимые для взаимодействия с сервисом аутентификации, причем для каждого провайдера в отдельности. В файле providers.php в закомментированном виде лежат настройки основных сервисов - vkontakte, facebook, twitter. Для добавления нужного сервиса нам нужно скопировать настройки оттуда и заменить consumer_key и consumer_secret на свои.
Как это сделать рассмотрим на примерах основных сервисов.
Vkontakte
- Заходим по ссылке http://vk.com/editapp?act=create&site=1 и добавляем приложение.
- При Выбираем тип "Веб-сайт", вводим адрес сайта и домен(при неправильно введенных данных приложение работать не будет).
- Название приложения надо сделать адекватным и понятным, так как оно будет отображаться пользователю при попытке аутентификации.
- После подтверждения по телефону(!), мы переходим на страницу приложения.
- Выбираем вкладку настройки. Там будут нужные нам параметры - ID приложения(consumer_key) и Защищенный ключ(consumer_secret)
- Заходим по ссылке https://developers.facebook.com/apps , регистрируемся как разработчик(подтверждение по телефону).
- Нажимаем создать новое приложение.
- Вводим адекватное имя приложения, оно будет отображаться посетителю
- Выбираем любую категорию и нажимаем кнопку Создать
- Попадаем на страницу приложения, вверху будут поля Идентификатор приложения и App Secret. Это и есть наши искомые коды, копируем их в настройки.
- Переходим во вкладку Настройки. Нажимаем добавить платформу, выбираем веб-сайт, и вставляем в появившееся поле Site URL url нашего сайта. В поле App Domains вставляем домен нашего сайта. Нажимаем сохранить.
- Заходим по ссылке https://dev.twitter.com/apps, нажимаем Create a new application;
- Заполняем поля;
- Название приложения придумываем адекватное, так как оно будет отображаться пользователю;
- Обращаем внимание на корректность Website(ссылка на сайт, где будет авторизация). Следует учесть что здесь должен быть точно тот сайт, с которого будут поступать запросы. Для разработки можно указать тут ссылку на локальный сайт, но при переносе на хостинг необходимо обязательно поменять url на основной сайт;
- Хоть поле Callback URL и не отмечено, заполняем его обязательно ссылкой такого вида
http://yousite.com/users/oauth/twitter/callback/
где меняем yousite.com на свой домен. Сайты на workspace не получится использовать, так как их адреса не являются валидными для системы.
- После этого попадаем на страницу, где на вкладке API keys получаем заветные параметры.
Связь с другими компонентами
Зачастую компонент Users необходим для использования информации о пользователе в других компонентах. Объект текущего пользователя доступен из любого компонента следующим образом:
WS::env()->auth->user
Отсутствие объекта говорит о том, что текущий посетитель не залогинен на сайте.
Права доступа
Компонент предоставляет следующие инструменты для использования в проверке прав доступа.
Пользователя можно назначить администратором через систему администрирования, выставив соответсвующий чекбокс. Проверка является ли пользователь админом осуществляется следующим образом:
$user->isadmin
В компоненте есть возможность создавать свой набор групп пользователей, а затем определять принадлежность к той или иной группе. Нужно это, например, для разграничения доступа в других компонентах. Группы доступа редактируются через систему администрирования, после их добавления они появляются на соответствующей вкладке на странице редактирования пользователя. Пользователь может принадлежать к нескольким группам сразу. Проверка принадлежности пользователя к группе осуществляется следующим образом:
$user->check_access('managers'); // проверка принадлежности к одной группе $user->check_access('managers,redactors,users'); // проверка принадлежности к нескольким группам
Так же есть методы, определяющие права пользователя на публикацию, на бан других пользователей, а так же дающие возможность проверить не забанен ли пользователь. Они могут быть легко переопределены под логику вашего проекта.
$user->can_post(); // по умолчанию возвращает true $user->can_ban(); // возвращает true, если пользователь - администратор $user->is_banned(); // возвращает false
Структура компонента и настройки
Все настройки находятся в папке config, в том числе схема, поля системы администрирования и тд. О такой реализации структуры подробнее можно почитать тут. Рассмотрим доступные настройки:
- admin_menu - пункты меню в системе администрирования(в меню компонентов)
- avatar - настройки аватара пользователя - доступные разрешения, максимальный вес изображения, размер изображения по умолчанию
- fields - поля для системы администрирования - как для страницы редактирования, так и для списка
- genpassword - настройки генерируемого пароля(длина и символы)
- messages - текстовые сообщения, используемые в компоненте
- providers - сторонные сервисы аутентификации, и openid и oauth
- questionnaire - поля для анкетных данных
- schema - собственно схема таблиц БД
- services - сервисы компонента, можно добавить свой и он будет доступен через компонент CMS::component('Users')->service('имя_сервиса')
CMS::component('Users')->service('имя_сервиса')
- tabs - вкладки на страницах редактирования