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

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

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

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

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

Авторизация настраивается отдельного для каждого сайта (домена), которые подключены к установке Вебасиста в приложении «Сайт» (в основном конфигурационном файле маршрутизации), в файле wa-config/auth.php:

<?php

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

Набор полей в форме регистрации регулируется элементом массива 'fields'. Можно использовать следующие значения:

'name', // если написать в него Иван Петров, то firstname станет Иван, lastname Петров автоматически
'sex', // пол
'birthday',
'phone.mobile',
'url',
'address', // композитное поле, состоящее из пяти подполей: адрес (улица, дом, квартира); город; область; страна; индекс
'im.skype',

Другие примеры полей посмотрите в файле с описанием полей контакта 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 [APP_ID]LoginAction extends waLoginAction
{
    public function execute()
    {
        // общий макет сайта
        $this->setLayout(new [APP_ID]FrontendLayout());
        // шаблон формы логина
        $this->setThemeTemplate('login.html');
        // вызов исполнения родительского класса, который содержит всю логику по входу
        parent::execute();
    }
}

В теме оформления фронтенда необходимо создать файл wa-apps/[APP_ID]/themes/default/login.html

<div class="content">
    <div id="page" role="main">
        <h1>Вход</h1>
        {$wa->authAdapters()}
        {$wa->loginForm($error)}
    </div>
</div>

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

Нужно создать файл wa-apps/[APP_ID]/lib/actions/[APP_ID]Signup.action.php

<?php

class [APP_ID]SignupAction extends waSignupAction
{
    public function execute()
    {
        // устанавливаем лейаут фронтенда
        $this->setLayout(new [APP_ID]FrontendLayout());
        $this->setThemeTemplate('signup.html');
        // запускаем выполнение родительского метода
        parent::execute();
    }

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

И шаблон wa-apps/[APP_ID]/themes/default/signup.html

<div class="content">
    <div id="page" role="main">
        {if !empty($contact)}
            <h1>Спасибо!</h1>
            <p>Вы успешно зарегистрировались.</p>
        {else}
            <h1>Регистрация</h1>
            {$wa->authAdapters()}
            {$wa->signupForm($errors)}
        {/if}
    </div>
</div>

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

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

Для реализации этих форм необходимо создать экшен wa-apps/[APP_ID]/lib/actions/[APP_ID]Forgotpassword.action.php

class [APP_ID]ForgotpasswordAction extends waForgotPasswordAction
{
    public function execute()
    {
        $this->setLayout(new [APP_ID]FrontendLayout());
        $this->setThemeTemplate('forgotpassword.html');
        parent::execute();
    }
}

И шаблон wa-apps/[APP_ID]/>themes/default/forgotpassword.html ($set_password — true, если нужно задать новый пароль; иначе — показать форму для ввода логина/email):

<div class="content">
    <div id="page" role="main">
    {if !empty($set_password)}
        <h1>Восстановление пароля для {$login}</h1>
        {$wa->setPasswordForm($error)}
    {else}
        <h1>Восстановление пароля</h1>
        {if !empty($sent)}
        <p>Инструкция по восстановлению пароля были отправлены на ваш email.</p>
        <br /><br />
        <a href="{$wa->loginUrl()}">Я вспомнил пароль!</a>
        {else}
        {$wa->forgotPasswordForm($error)}
        {/if}
    {/if}
    </div>
</div>

Внутренний роутинг приложения

Все эти 3 экшена форм входа, регистрации и восстановления пароля необходимо затем поселить во внутреннем роутинге приложения: в файле wa-apps/[APP_ID]/lib/config/routing.php:

<?php

return array(
    // форма логина
    'login/' => 'login', // то есть по УРЛу /login будет отрабатывать экшен [APP_ID]LoginAction
    // восстановление пароля
    'forgotpassword/' => 'forgotpassword',
    // форма регистрации
    'signup/' => 'signup',
    //... остальные правила маршрутизации во фронтенде вашего приложения
);

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


Функции хелпера $wa Smarty, которые упрощают реализацию авторизации/регистрации в вашем приложении (некоторые из этих функций использовались в представленных формах выше).

{$wa->isAuthEnabled()} — разрешена или нет авторизация на данном сайте

{$wa->signupUrl()} — относительный URL страницы регистрации
{$wa->loginUrl()} — относительный URL страницы входа
{$wa->forgotPasswordUrl()} — относительный URL страницы восстановления пароля

{$wa->signupForm($errors)} — HTML-код формы регистрации; $errors — массив ошибок, которые передает экшен signupAction (логика генерации этого массива реализована на системном уровне)
{$wa->loginForm($errors)} — HTML-код формы авторизации (входа)
{$wa->forgotPasswordForm($errors)} — HTML-код формы восстановления пароля, на которой у пользователя запрашивается логин или email
{$wa->setPasswordForm($errors)} — HTML-код формы задания нового пароля, на которую пользователь переходит по ссылке сброса пароля

{$wa->authAdapters()} — возвращает HTML-блок для авторизации через внешние сервисы (соцсети)
{$wa->authAdapters(true)} — возвращает массив адаптеров для входа через внешние сервисы (соцсети)


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

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

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

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

PHP

В экшенах/контроллерах:

if ($this->getUser()->getId()) {
     // авторизован
}

В произвольном месте:

if (wa()->getUser()->getId()) {
     // авторизован
}

Smarty

{if $wa->userId()}
   // авторизован
{/if}