Component Users: Зарегистрированные пользователи

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

Страницы контроллера

Сразу после установки компонента доступны следующие страницы:

  • /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)

Facebook

  • Заходим по ссылке https://developers.facebook.com/apps , регистрируемся как разработчик(подтверждение по телефону).
  • Нажимаем создать новое приложение.
  • Вводим адекватное имя приложения, оно будет отображаться посетителю
  • Выбираем любую категорию и нажимаем кнопку Создать
  • Попадаем на страницу приложения, вверху будут поля Идентификатор приложения и App Secret. Это и есть наши искомые коды, копируем их в настройки.
  • Переходим во вкладку Настройки. Нажимаем добавить платформу, выбираем веб-сайт, и вставляем в появившееся поле Site URL url нашего сайта. В поле App Domains вставляем домен нашего сайта. Нажимаем сохранить.

Twitter

  • Заходим по ссылке 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 - вкладки на страницах редактирования
04.07.2014
Все статьи