Авторизация во фронтенде

Содержание...

Фреймворк Webasyst позволяет разработчику приложения реализовать механизм регистрации и авторизации (входа с паролем) для посетителей сайта.

В качестве примера, в котором реализована описанная ниже система авторизации пользователей во фронтенде, рекомендуем посмотреть приложение «Гостевая книга 2».

Включение авторизации на сайте

Авторизация настраивается отдельного для каждого сайта, подключённого к аккаунту Webasyst, в приложении «Сайт», которое сохраняет настройки авторизации в файле wa-config/auth.php:

<?php

return [
    'domain1.ru' => [
    // разрешает авторизацию на сайте, в шаблонах темы дизайна за это отвечает функция $wa->isAuthEnabled()
    'auth' => true,
    // приложение, которое отвечает за регистрацию/авторизацию,
    // приложение должно поддерживать авторизацию (в файле app.php должно быть указано 'auth' => true)
    'app' => 'blog',
    // адаптеры авторизации через внешние сервисы
    'adapters' => [
        'facebook' => [
            'app_id' => 'FACEBOOK_APP_ID',
            'app_secret' => 'FACEBOOK_APP_SECRET',
        ],
        // ... другие адаптеры
    ],
    /*
    Массив, определяющий набор полей в форме регистрации.
    Если не задан явно, то используется следующий набор:
    'fields' => [
        'firstname',
        'lastname',
        '', // разделитель
        'email',
        'password', //ввод и подтверждение пароля
    ]
    */
    ],
    'domain2.ru' => [
        // ... настройки для некоторого другого сайта domain2.ru
    ]
];

Набор полей в форме регистрации регулируется элементом массива 'fields'. Примеры обозначений полей:

  • 'name': полное имя;
  • 'sex': пол;
  • 'birthday': дата рождения;
  • 'phone.mobile': номер телефона с указанием обозначения 'mobile', 'work' и т. п.s;
  • 'url': адрес сайта;
  • 'address': композитное поле адреса, состоящее из отдельных элементарных полей: улица + дом + квартира, город, регион, страна, индекс;
  • 'im.telegram': идентификатор в соцсети или в мессенджере, например, 'telegram', 'whatsapp', 'facebook' и т. п.

Информацию о других доступных полях можно найти в файле wa-system/contact/data/fields.php.

Авторизация и регистрация посетителей сайта

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

  1. В файле wa-apps/[app_id]/lib/config/app.php нужно указать, что ваше приложение поддерживает авторизацию пользователей:

    'auth' => true,

    У вашего приложения должен быть фронтенд:

    'frontend' => true,
  2. Необходимо реализовать 3 экшена, отвечающих за работу форм авторизации, регистрации и восстановления пароля, как описано далее.

Форма авторизации

Создайте файл wa-apps/[app_id]/lib/actions/[app_id]Login.action.php по следующему образцу:

<?php

class myappLoginAction extends waLoginAction
{
    public function execute()
    {
        // общий макет страниц сайта
        $this->setLayout(new myappFrontendLayout());

        // подключение шаблона формы авторизации
        $this->setThemeTemplate('login.html');

        // вызов родительского класса, который содержит стандартную логику авторизации
        parent::execute();
    }
}

В теме дизайна создайте файл login.html с кодом для отображения формы авторизации.

{$wa->loginForm()}

Форма регистрации

Создайте файл wa-apps/[app_id]/lib/actions/[app_id>]Signup.action.php.

<?php

class myappSignupAction extends waSignupAction
{
    public function execute()
    {
        // основной макет страниц сайта
        $this->setLayout(new [APP_ID]FrontendLayout());

        // подключение шаблона формы регистрации
        $this->setThemeTemplate('signup.html');

        // выполнение родительского метода с общей логикой регистрации
        parent::execute();
    }

    /**
     * Этот метод вызывается после успешного создания нового контакта.
     * В нём можно, например, отправить приветственное письмо новому пользователю
     * или добавить его контакт в категорию, соответствующую вашему приложению.
     */
    protected function afterSignup(waContact $contact)
    {
        $contact->addToCategory($this->getAppId());
    }
}

Создайте в теме дизайна файл signup.htmlс кодом для отображения формы регистрации.

{$wa->signupForm($errors)}

Форма восстановления пароля

Для реализации формы восстановления пароля, а также формы для ввода нового пароля, создайте файл wa-apps/[app_id]/lib/actions/[appp_id>]Forgotpassword.action.php.

class myappForgotpasswordAction extends waForgotPasswordAction
{
    public function execute()
    {
        // основной макет страниц сайта
        $this->setLayout(new myappFrontendLayout());

        // подключение шаблона формы восстановления пароля
        $this->setThemeTemplate('forgotpassword.html');

        // выполнение родительского метода с общей логикой восстановления пароля
        parent::execute();
    }
}

В теме дизайна создайте файл forgotpassword.html с кодом для отображения формы восстановления пароля.

{if !empty($set_password)}
    {* Если в $set_password содержится true, показываем форму для ввода нового пароля *}
    {$wa->setPasswordForm()}
{else}
    {* В противном случае показываем форму для ввода email-адреса *}
    {if !empty($sent)}
        <p>Инструкция по восстановлению пароля отправлена на ваш email-адрес.</p>
        <p><a href="{$wa->loginUrl()}">Я вспомнил пароль!</a></p>
    {else}
        {$wa->forgotPasswordForm()}
    {/if}
{/if}

Внутренняя маршрутизация приложения

Описанные классы для реализации форм авторизации, регистрации и восстановления пароля нужно поселить во внутренней маршрутизации приложения, т. е. указать соответствующие адреса в файле wa-apps/[app_id>]/lib/config/routing.php.

<?php

return [
    // форма авторизации
    'login/' => 'login', // по адресу login/ сработает класс myappLoginAction

    // форма восстановления пароля
    'forgotpassword/' => 'forgotpassword',

    // форма регистрации
    'signup/' => 'signup',

    // ... остальные правила маршрутизации во фронтенде вашего приложения ...
];

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


Методы объекта $wa

Для удобной работы с функциями авторизации и регистрации в объекте $wa в шаблонах Smarty доступны следующие методы:

  • isAuthEnabled

    Возвращает статус настройки доступности функций авторизации на текущем сайте.

  • signupUrl

    Возвращает URL страницы регистрации.

  • loginUrl

    Возвращает URL страницы авторизации.

  • forgotPasswordUrl

    Возвращает URL страницы восстановления пароля.

  • signupForm

    Возвращает HTML-код формы регистрации.

  • loginForm

    Возвращает HTML-код формы авторизации.

  • forgotPasswordForm

    Возвращает HTML-код формы запроса данных для восстановления пароля.

  • setPasswordForm

    Возвращает HTML-код формы ввода нового пароля в рамках процедуры восстановления.

  • authAdapters

    Возвращает информацию о настроенных адаптерах авторизации через внешние сервисы.

isAuthEnabled()

Возвращает статус настройки доступности функций авторизации на текущем сайте.

Пример

{if $wa->isAuthEnabled()}
    <!-- Авторизация на этом сайте включена! -->
{/if}

signupUrl ($absolute = false)

Возвращает URL страницы регистрации.

Параметры

  • $absolute

    Флаг, обозначающий необходимость вернуть абсолютный URL.

Пример

{$relative_signup_page_url = $wa->signupUrl()}
{$absolute_signup_page_url = $wa->signupUrl(true)}

loginUrl ($absolute = false)

Возвращает URL страницы авторизации.

Параметры

  • $absolute

    Флаг, обозначающий необходимость вернуть абсолютный URL.

Пример

{$relative_login_page_url = $wa->loginUrl()}
{$absolute_login_page_url = $wa->loginUrl(true)}

forgotPasswordUrl ($absolute = false)

Возвращает URL страницы восстановления пароля.

Параметры

  • $absolute

    Флаг, обозначающий необходимость вернуть абсолютный URL.

Пример

{$relative_password_recovery_page_url = $wa->forgotPasswordUrl()}
{$absolute_password_recovery_page_url = $wa->forgotPasswordUrl(true)}

signupForm ($errors = [], $options = [])

Возвращает HTML-код формы регистрации.

Параметры

  • $errors

    Массив сообщений об ошибках, которые нужно показать в форме. В шаблоне Smarty этот массив доступен в виде переменной $errors.

  • $options

    Массив параметров отображения и поведения формы со следующими ключами:

    • show_title: Флаг, обозначающий необходимость отображения заголовка формы. Значение по умолчанию — false.
    • namespace: Строка для обозначения общего названия параметра запроса, через который можно получить значения всех полей формы при обработке их значений на сервере. По умолчанию значение не задано.
    • show_oauth_adapters: Флаг, обозначающий необходимость отображения в форме кнопок входа через сторонние сервисы. Значение по умолчанию — false.
    • need_redirects: Флаг, обозначающий необходимость перенаправления пользователя после завершения регистрации на исходную страницу сайта, с которой он перешёл к регистрации. Значение по умолчанию — true.
    • need_placeholders: Флаг, обозначающий необходимость показывать значения атрибутов placeholder в текстовых полях формы. Значение по умолчанию — true.
    • include_css: Флаг, обозначающий необходимость включить в состав HTML-кода формы стандартный блок CSS-кода. Значение по умолчанию — true.
    • contact_type: Обозначение типа контакта, данные которого нужно сохранить после регистрации:
      • person: персона (значение по умолчанию);
      • company: компания.

Пример

{$wa->signupForm([], [
    'show_title'          => true,
    'show_oauth_adapters' => true,
    'namespace'           => 'fields',
    'need_redirects'      => false,
    'need_placeholders'   => false,
    'contact_type'        => 'company'
])}

loginForm ($errors = [], $options = [])

Возвращает HTML-код формы авторизации.

Параметры

  • $errors

    Массив сообщений об ошибках, которые нужно показать в форме. В шаблоне Smarty этот массив доступен в виде переменной $errors.

  • $options

    Массив параметров отображения и поведения формы со следующими ключами:

    • title: Собственный текстовый заголовок, которым можно заменить стандартный заголовок формы.
    • sub_title: Собственный текстовый подзаголовок, который можно показывать под основным заголовком формы.
    • show_title: Флаг, обозначающий необходимость отображения заголовка формы. Значение по умолчанию — false.
    • show_sub_title: Флаг, обозначающий необходимость отображения подзаголовка формы. Значение по умолчанию — false.
    • namespace: Строка для обозначения общего названия параметра запроса, через который можно получить значения всех полей формы при обработке их значений на сервере. По умолчанию значение не задано.
    • show_oauth_adapters: Флаг, обозначающий необходимость отображения в форме кнопок входа через сторонние сервисы. Значение по умолчанию — false.
    • need_redirects: Флаг, обозначающий необходимость перенаправления пользователя после завершения авторизации на исходную страницу сайта, с которой он перешёл к авторизации. Значение по умолчанию — true.
    • need_placeholders: Флаг, обозначающий необходимость показывать значения атрибутов placeholder в текстовых полях формы. Значение по умолчанию — true.
    • include_css: Флаг, обозначающий необходимость включить в состав HTML-кода формы стандартный блок CSS-кода. Значение по умолчанию — true.
    • url: Собственный URL вместо стандартного, на который должны отправляться данные формы во время авторизации пользователя.

Пример

{$wa->loginForm([], [
    'show_title'          => true,
    'title'               => 'My title',
    'show_sub_title'      => true,
    'sub_title'           => 'My subtitle',
    'show_oauth_adapters' => true,
    'namespace'           => 'fields',
    'need_redirects'      => false,
    'need_placeholders'   => false,
    'include_css'         => false
])}

forgotPasswordForm ($errors = [], $options = [])

Возвращает HTML-код формы запроса данных для восстановления пароля.

Параметры

  • $errors

    Массив сообщений об ошибках, которые нужно показать в форме. В шаблоне Smarty этот массив доступен в виде переменной $errors.

  • $options

    Массив параметров отображения и поведения формы со следующими ключами:

    • title: Собственный текстовый заголовок, которым можно заменить стандартный заголовок формы.
    • sub_title: Собственный текстовый подзаголовок, который можно показывать под основным заголовком формы.
    • show_title: Флаг, обозначающий необходимость отображения заголовка формы. Значение по умолчанию — false.
    • show_sub_title: Флаг, обозначающий необходимость отображения подзаголовка формы. Значение по умолчанию — false.
    • namespace: Строка для обозначения общего названия параметра запроса, через который можно получить значения всех полей формы при обработке их значений на сервере. По умолчанию значение не задано.
    • show_oauth_adapters: Флаг, обозначающий необходимость отображения в форме кнопок входа через сторонние сервисы. Значение по умолчанию — false.
    • need_redirects: Флаг, обозначающий необходимость перенаправления пользователя после завершения восстановления пароля на исходную страницу сайта, с которой он перешёл к восстановлению пароля. Значение по умолчанию — true.
    • need_placeholders: Флаг, обозначающий необходимость показывать значения атрибутов placeholder в текстовых полях формы. Значение по умолчанию — true.
    • include_css: Флаг, обозначающий необходимость включить в состав HTML-кода формы стандартный блок CSS-кода. Значение по умолчанию — true.

Пример

{$wa->forgotPasswordForm([], [
    'show_title'          => true,
    'title'               => 'My title',
    'show_sub_title'      => true,
    'sub_title'           => 'My subtitle',
    'show_oauth_adapters' => true,
    'namespace'           => 'fields',
    'need_redirects'      => false,
    'need_placeholders'   => false,
    'include_css'         => false
])}

setPasswordForm ($errors = [], $options = [])

Возвращает HTML-код формы ввода нового пароля в рамках процедуры восстановления.

Параметры

  • $errors

    Массив сообщений об ошибках, которые нужно показать в форме. В шаблоне Smarty этот массив доступен в виде переменной $errors.

  • $options

    Массив параметров отображения и поведения формы со следующими ключами:

    • title: Собственный текстовый заголовок, которым можно заменить стандартный заголовок формы.
    • sub_title: Собственный текстовый подзаголовок, который можно показывать под основным заголовком формы.
    • show_title: Флаг, обозначающий необходимость отображения заголовка формы. Значение по умолчанию — false.
    • show_sub_title: Флаг, обозначающий необходимость отображения подзаголовка формы. Значение по умолчанию — false.
    • namespace: Строка для обозначения общего названия параметра запроса, через который можно получить значения всех полей формы при обработке их значений на сервере. По умолчанию значение не задано.
    • show_oauth_adapters: Флаг, обозначающий необходимость отображения в форме кнопок входа через сторонние сервисы. Значение по умолчанию — false.
    • need_redirects: Флаг, обозначающий необходимость перенаправления пользователя после завершения восстановления пароля на исходную страницу сайта, с которой он перешёл к восстановлению пароля. Значение по умолчанию — true.
    • need_placeholders: Флаг, обозначающий необходимость показывать значения атрибутов placeholder в текстовых полях формы. Значение по умолчанию — true.
    • include_css: Флаг, обозначающий необходимость включить в состав HTML-кода формы стандартный блок CSS-кода. Значение по умолчанию — true.

Пример

{$wa->setPasswordForm([], [
    'show_title'          => true,
    'title'               => 'My title',
    'show_sub_title'      => true,
    'sub_title'           => 'My subtitle',
    'show_oauth_adapters' => true,
    'namespace'           => 'fields',
    'need_redirects'      => false,
    'need_placeholders'   => false,
    'include_css'         => false
])}

authAdapters ($return_array = false, $options = [])

Возвращает информацию о настроенных адаптерах авторизации через внешние сервисы.

Параметры

  • $return_array

    Флаг, обозначающий необходимость вернуть массив с параметрами адаптеров авторизации. Если не указано true, то метод вернёт HTML-код кнопок авторизации для отображения на сайте.

  • $options

    Массив параметров отображения и поведения форм авторизации через сторонние сервисы со следующими ключами:

    • width: Ширина всплывающего окна в пикселях, которое должно открываться во время авторизации через любой из сервисов авторизации.
    • height: Высота всплывающего окна в пикселях, которое должно открываться во время авторизации через любой из сервисов авторизации.
    • [идентификатор сервиса авторизации]: Массив с ключами width и height, в значениях которого можно указать индивидуальную ширину и высоту всплывающего окна, которое должно открываться во время авторизации через указанный сервис. Для каждого сервиса авторизации можно добавить свой массив со значениями ширины и высоты, если должны отличаться от стандартных.

Пример

{* Показать кнопки авторизации через сторонние сервисы *}
{$wa->authAdapters(false, [
    'width'  => 700,
    'height' => 600,
    'google' => [
        'width'  => 750,
        'height' => 650
    ]
])}

Авторизация через внешние сервисы (соцсети)

Фреймворк Webasyst предоставляет возможность настроить для посетителей сайта авторизацию через внешние сервисы (соцсети). Эта возможность реализована с помощью адаптеров авторизации. Показать кнопки для такого способа авторизации можно с помощью метода {$wa->authAdapters()} или использования параметра с ключом 'show_oauth_adapters' при использовании методов для отображения форм, связанных с авторизацией.

Как проверить, авторизован ли пользователь

Содержимое страниц сайта можно сделать скрытым для всех посетителей и показывать его только зарегистрированным клиентам — с помощью проверки авторизации пользователя.

PHP

// в экшенах и контроллерах
if ($this->getUser()->getId()) {
     // пользователь авторизован
}

// в других местах
if (wa()->getUser()->getId()) {
    // пользователь авторизован
}

Smarty

{if $wa->userId()}
   {* пользователь авторизован *}
{/if}