Advertisement
  1. Code
  2. Ruby on Rails

Авторизация с Pundit

Read Time:7 minsLanguages:

Russian (Pусский) translation by Marat Amerov (you can also view the original English article)

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

В этом уроке вы создадите блог, который предоставляет доступ к таким частям, как создание, обновление и удаление статей только авторизованным пользователям.

Начнем

Начнем с создания нового Rails приложения.

Флаг -T сообщает Rails генерировать новое приложение без набора тестов по умолчанию. Запуск команды приведет к созданию Rails приложения и установки гемов по умолчанию.

Далее добавьте следующие гемы в свой Gemfile. Вы будете использовать bootstrap-sass для макета вашего приложения, а Devise будет обрабатывать аутентификацию пользователя.

Запустите команду для установки гемов.

Теперь переименуйте app/assets/stylesheets/application.css в app/assets/stylesheets/application.scss. Добавьте следующие строки кода для импорта bootstrap.

Создайте партиал _navigation.html.erb, который будет содержать код навигации; Партиал должен быть расположен в каталоге app/views/layouts. Партиал должен выглядеть, как показано внизу.

Чтобы использовать навигацию, вам необходимо рендерить ее в макете приложения. Подкорректируйте свой лайоут приложения так, как показано ниже.

Создание модели пользователя

Запустите команду для установки Devise.

Теперь создайте модель пользователя.

Миграция базы данных.

Создание ресурсов статей

Запустите команду для генерации ресурсов статьи.

Это создаст  ArticleController и модель статьи. также будут сгенерированы требуемые views.

Теперь выполните миграцию базы данных, запустив:

Откройте app/views/articles/_form.html.erb и сделайте его похожим на то, что показано ниже.

Для вашего index файла это должно выглядеть так.

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

Откройте файл маршрутов и добавьте маршрут для ресурсов статей.

Интеграция Pundit

Добавьте гем Pundit в свой Gemfile.

Запустите команду для установки.

Интегрируйте Pundit в свое приложение, добавив следующую строку в свой ApplicationController.

Запустите генератор Pundit.

Будет создана папка app/policies, которая содержит базовый класс с политиками. Каждая политика является простым классом Ruby.

Так выглядит базовый класс политик.

Создание политики статьи

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

Чтобы достичь этого, ваша политика для статей будет выглядеть так.

В приведенном выше примере вы разрешаете всем (зарегистрированным и незарегистрированным пользователям) видеть страницу индекса. Чтобы создать новую статью, пользователь должен быть зарегистрирован. Вы используете user.present? Чтобы узнать, зарегистрирован ли пользователь, пытающийся выполнить действие.

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

На этом этапе вам необходимо установить связь между моделями статьей и пользователя.

Для этого создадим новую миграцию.

Затем выполните миграцию базы данных, выполнив команду:

Откройте модель User и добавьте строку, которая добавляет отношения.

Ваша модель статьи должна иметь это.

Теперь вам нужно обновить свой ArticleController, чтобы он соответствовал с тем, что вы сделали до сих пор.

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

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

Этот код просто отображает основной текст, который сообщает пользователю, что он не может выполнять действие.

Запуск:

Чтобы запустить свой сервер Rails, перейдите на https://localhost:3000, чтобы узнать, что получилось.

Заключение

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

Вы можете узнать больше о Pundit, проверив страницу на GitHub.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.