Во фреймворке реализован механизм, который позволяет разработчику приложения достаточно просто реализовать механизм регистрации и авторизации (входа с паролем) для пользователей. Хранение данных о зарегистрированных пользователях осуществляется приложением «Контакты», а ядро фреймворка предоставляет интерфейсы для подключения форм регистрации и входа в шаблонах дизайна приложения.
В качестве примера, в котором реализована описанная ниже система авторизации пользователей во фронтенде, рекомендуем посмотреть приложение «Гостевая книга 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
.
Авторизация и регистрация пользователей во фронтенде вашего приложения
Оформление и функционал форм авторизации зависит от приложения, и поэтому подключаются на сайте не на системном уровне, а на уровне приложения. Фреймворк предоставляет готовые инструменты для удобного подключения этих форм внутри приложения, но подходящее место для их внедрения, их внешний вид и содержимое определяет исключительно разработчик приложения.
-
В файле
wa-apps/APP_ID/lib/config/app.php
необходимо указать, что ваше приложение поддерживает авторизацию пользователей:'auth' => true
Ну и, конечно же, у вашего приложения должен быть фронтенд:
'frontend' => true
-
Необходимо создать 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}