MODx Revo, настройка авторизации Login. Базовая установка

Данная статья в большей части является переводом урока с официального rtfm, а именно компонента «Login», но с вставками переводчика. На лучший перевод не иду, но суть в итоге должна быть понятной. Тем не менее, перевода на русский я до сих не нашёл.
Данный урок, хоть и называется «базовым», имеет много взаимосвязанных частей. В данном уроке мы будем обсуждать, какие страницы надо создать, какие чанки (фрагменты кода) и сниппеты нужно опубликовать на страницах для полноценной авторизации пользователей.

Номера в скобках — это ID ресурсов. Это page_id, у вас он может отличаться. Здесь они выбраны просто для удобства.

Создаём нужные страницы


Перед тем, как выложим чанки с фрагментами кода, создадим пять страниц.
  • Страница входа (1): страница, содержащая форму входа
  • Сброс пароля (2): страница, где пользователи могут запросить восстановление пароля
  • Сброс пароля, обработчик (3): скрытая страница, которая будет на самом деле сбрасывать пароль. Пользователи её видеть не будут.
  • Страница только для пользователей (4): страница, содержимое которого видят только авторизованные пользователи сайта
  • Страница выхода (5): страница, на которую переадресовывается пользователь после успешного выхода

Вот так у меня выглядит дерево ресурсов в данный момент. Имейте виду, что у вас ID ресурсов будет другой. В данном примере ничего кроме страниц для компонента «Login» нету.

Дальше, нам нужно назначить правильные права для пользователей и ресурсов.

Создаём необходимые группы пользователей и группы ресурсов


MODX Revo имеет очень гибкую систему детализации прав, когда дело доходит до разрешений для пользователей, но в данной теме мы сделаем только то, что нам нужно не заходя глубоко в тему. И так, приступим.
1. Безопасность → Группы Ресурсов
Нажимаем на «Создать группу ресурсов» и называем её «Только для пользователей», например. Нажимаем «Сохранить» и всё, на данной странице больше ничего не меняем.


2. Безопасность → Контроль доступа
На первой вкладке «Группы пользователя» нажимаем на «Новая группа пользователей». Новую группу назовём «Пользователи» и нажмём «Сохранить». Группа пользователей будет иметь доступ к ресурсам «Только для пользователей». Зачем это нам, мы узнаем чуть позже в рамках этого урока.


3. На этой же странице (Безопасность → Контроль доступа), щелкнём правой кнопкой мыши на созданную группу пользователей и выберем «Редактировать группу пользователей».


Далее переходим на вкладку «Доступ к группам ресурсов» и щёлкаем на «Добавить группу ресурсов». Для правильной работы, должны быть как минимум такие параметры:
Группа ресурсов: Только для пользователей (тот, который мы только что создали)
Минимальная роль: Member-9999
Политика доступа: Load, List and View
Контекст: web
И сохраняем.


4. Безопасность → Управление пользователями
Создаём «нового пользователя» и тем самым проверяем, как будет работать разграничение прав доступа для пользователей.
В данном случае, используйте простой логин и пароль, ибо нам, как я уже выше писал — важно убедиться в том, что новый пользователь находится в группе «Пользователи». Для этого переходим на вкладку «Права доступа» и нажимаем на «Добавить пользователя в группу».
Группа пользователя: Пользователи
Роль: Member
Затем нажимаем «сохранить» у окошка, а затем ещё раз в правом углу панели управления.


Это должно нам гарантировать, что новый пользователь может войти в систему с правами «Пользователя», чтобы смотреть страницу с правами «Только для пользователей».
Теперь вернёмся назад к страницам, дабы добавить сниппеты и фрагменты кода на соответствующие страницы.

Добавляем сниппеты на страницы



Страница входа (1)


Поместите следующий код вызова сниппета на странице входа пользователей.
[[!Login? &loginTpl=`lgnLoginTpl` &logoutTpl=`lgnLogoutTpl` &errTpl=`lgnErrTpl` &loginResourceId=`4` &logoutResourceId=`5`]] 

Чанк (фрагмент кода), который отображает форму входа, должна также включать в себя ссылку на страницу с «восстановлением пароля». Разберём, что у нас в вызове формы:
&loginTpl=`lgnLoginTpl` — за форму входа отвечает чанк lgnLoginTpl, если пользователь не авторизован
&logoutTpl=`lgnLogoutTpl` — если пользователь авторизован, то ему будет выдаваться содержимое чанка lgnLogoutTpl
&errTpl=`lgnErrTpl` — при неправильном вводе данных для авторизации, или простым словом «ошибке», будет выводиться чанк lgnErrTpl
&loginResourceId=`4` — куда переадресовывать пользователя после успешной авторизации. Указано в виде ID ресурса, в данном случае 4.
&logoutResourceId=`5` — если пользователь авторизован, то при выходе будет переадресован на страницу с ID равным 5.
Так же, хочу отметить, что эти чанки стандартные, можно создать свои чанки, на любой вкус, вёрстку, и реализацию. Это предоставляет возможность выводить форму входа/выхода и прочее в любом желаемом виде, и причём, не устраивая хаоса с кодом. Стандартные шаблоны, кстати, тоже можно изменять.
Вот код, который будет отдаваться пользователям, которые ещё не авторизовались, другими словами — «форма входа». Чанк — lgnLoginTpl.
<div class="loginForm">
    <div class="loginMessage">[[+errors]]</div>
    <div class="loginLogin">
        <form class="loginLoginForm" action="[[~[[*id]]]]" method="post">
            <fieldset class="loginLoginFieldset">
                <legend class="loginLegend">[[+actionMsg]]</legend>
                <label class="loginUsernameLabel">[[%login.username]]
                    <input class="loginUsername" type="text" name="username" />
                </label>
                 
                <label class="loginPasswordLabel">[[%login.password]]
                    <input class="loginPassword" type="password" name="password" />
                </label>
                <input class="returnUrl" type="hidden" name="returnUrl" value="[[+request_uri]]" />
 
                [[+login.recaptcha_html]]
                 
                <input class="loginLoginValue" type="hidden" name="service" value="login" />
                <span class="loginLoginButton"><input type="submit" name="Login" value="[[+actionMsg]]" /></span>
            </fieldset>
        </form>
    </div>
</div>
 
<a href="[[~2]]">Забыли пароль?</a>

Вы можете поставить ссылку на «Забыли пароль» (Сброс пароля) внутри вашего шаблона и ссылаться на него по ID. В моём случае, ID ресурса с восстановлением пароля — 2.

Сброс пароля (2)


Начнём с того, что это страница чаще всего скрыта из меню. Она является в большей части формой, с помощью которой пользователи могут сбросить пароль. Тут хочется вам объяснить то, что страница со сбросом пароля (с ID 2 в моём случае), предоставляет возможность сказать о том, что пароль нужно восстановить, а сам сброс делает страница «Сброс пароля, обработчик (3)».
Вызываем форму сброса пароля следующим кодом:
[[!ForgotPassword? &resetResourceId=`3` &tpl=`lgnForgotPassTpl`]]

Разберём вызов:
&resetResourceId=`3` — страница обработчик (в моём случае с ID 3), именно она сбрасывает.
&tpl=`lgnForgotPassTpl` — чанк с кодом, в котором есть форма сброса пароля.
Чтобы понять, зачем обработчик и как это работает, предлагаю взглянуть на картинку:



Сброс пароля, обработчик (3)


Данная страница должна быть спрятана из всяких менюшек. Тем не менее, даже если ссылка на неё будет — она будет просто бессмысленная.
Суть её в следующем. Когда пользователь запрашивает сброс пароля, ему на почту приходит сообщение с этой ссылкой, а также с хэшем. Когда пользователь переходит по ссылке из почты, MODx сбрасывает пароль и переадресует пользователя на страницу с входом.
На странице обработчика, сниппет вызывается вот так:
[[!ResetPassword? &loginResourceId=`1`]]
— &loginResourceId=`1` указывает, на какую страницу переадресовывать, в нашем случае на страницу с ID 1, где есть форма входа.

Страница только для пользователей (4)


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



Страница выхода (5)


Это страница, на которую попадают пользователи после успешного выхода из аккаунта. Страница должна содержать только основное, например сообщение с прощанием, или ссылку на форму входа. Например:
<p>Спасибо за посещение! Возвращайтесь скорее!</p>


Дополнительно



Страница выхода (5)


Это не является обязательным, но для тестирования и вообще, удобства при разработке, можно получить специальную ссылку для выхода. Для этого создаём «новую ссылку» (web-link) и заполняем её страницу с ID 1. Например, вызывать страницу со ссылкой вот так:
[[~1? &service=`logout`]]

Это можно использовать для выхода в таком виде:
<a href="[[~1? &service=`logout`]]" title="Выйти">Выйти</a>


Возможные ошибки


После того, как мы собрали все страницы, связали их, настроили права доступа, мы должны всё проверить. Если всё работает по нашему плану, то при входе мы будет переправлены на страницу «Только для пользователей». Выйти из аккаунта мы может через страницу входа, так как, если мы авторизованы — то на странице входа появится ссылка на выход. После успешного выхода, вы должны быть переправлены на «страницу выхода».

Я не могу авторизоваться!


Обычно, такие проблемы возникают при неправильном указании ID страниц, неправильно написанных имён чанков, или пропущенных квадратных скобок. Внимательно проверьте коды.

Кроме этого, стоит помнить, что все выше написанные сниппеты должны вызываться некэшированными. Конечно, некоторые возможно будут работать в кэшированном виде, но большинство — нет. Вызывать в некэшированном виде можно с помощью восклицательного знака, например надо писать вот так:
[[!Login]]

А не так:
[[Login]]


Я не могу выйти из аккаунта!


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

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

Вопросы задавайте, если знаю ответ, несомненно помогу. Следующий урок будет переведён в свободное время. Ваши комментарии будут учтены :)
За оформление кода извиняюсь — в первый раз, а как оформлять — нигде не написано…
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 10

    0
    >>Вопросы задавайте, если знаю ответ, несомненно помогу. Следующий урок будет переведён в свободное время. Ваши комментарии будут учтены :)

    А какой именно? Было бы очень интересно прочитать аналогичную статью о работе с QUIP.
      0
      На официальном rtfm, у компонента login есть ещё несколько уроков (регистрация, хуки, свои дополнительные поля).

      Что именно интересует у Quip? Добавление/удаление комментариев, или что? :)
      0
      Да ничего конкретного, я не правильно понял про другие уроки)

      Собираюсь поставить Quip и прикрутить к сайту коментарии, впринципе сам разберусь, там не сложно.
        0
        Если будут проблемы, то пишите — помогу :) А так, со временем может напишу.
        0
        Эхх, если бы в свое время… А то приходилось все самому рыть, да по-аглицки, да еще авторы любят каких-нибудь словечек напихать, мммм… Но все равно спасибо за труд!
          0
          Было бы интересно прочитать о том, как создать пользователя, который смог бы иметь доступ к админке, но не ко всем функциям, а только мог бы добавлять, к пример, дочерние документы такого-то ресурса. Ну или только редактировать такую-то ветку дерева ресурсов. На данный момент приходит в голову написать альтернативную админку для каждого типа сотрудников фирмы, но мне кажется должен быть нативный способ организовать такое.
            0
            Шаблон политик доступов и группы ресурсов с этим справятся.

            Сейчас я остановился из-за того, что скоро на выходе будет MODx Revo 2.2. Жду стабильную версию, а затем уже буду продолжать.
              0
              *Шаблон политик доступов и группы ресурсов с этим справятся*
              Где нибудь есть толковые статьи об этом на русском?
                0
                Вот и у меня с поиском русской документации проблемы, хотя странно, ведь MODx вполне гибкая система. Но тут есть помощь — на одном довольно дружелюбном и полезном сообществе по MODx есть документация, которая немного внесёт ясности. Короче — вот. Немало русскоговорящих гуру сидят там, так что задавать вопросы там тоже можно :)
            0
            А как быть, если у меня двуязычный сайт? Работает только в конексте web, а вот в en не работает. Что делать? &context=`web,en` не работает((

            Only users with full accounts can post comments. Log in, please.