Статьи

Аутентификация в Rails с использованием зазора

Clearance — это простая система аутентификации с электронной почтой и паролем, созданная командой Thoughtbot. Он имеет несомненные значения по умолчанию, но его легко переопределить. Система активно поддерживается, и вы можете следить за GitHub .

В этом руководстве вы увидите, как интегрировать Clearance в приложение Rails. Мы будем использовать миниатюрное приложение. Давайте начнем!

Вы начнете с генерации вашего Rails-приложения. Для целей этого урока я назову мой tutsplus-clearance .

1
rails new tutsplus-clearance -T

Это сделает волшебство.

Вам понадобится начальная загрузка, чтобы приложение выглядело хорошо. Добавьте самоцвет Bootstrap в свой Gemfile .

1
2
3
4
#Gemfile
 
gem ‘bootstrap-sass’

Установите драгоценный камень, запустив bundle install .

Теперь измените application . scss чтобы выглядеть так:

1
2
3
4
#app/assets/stylesheets/application.scss
 
@import ‘bootstrap-sprockets’;
@import ‘bootstrap’;

Откройте свой Gemfile чтобы добавить драгоценный камень Clearance.

1
2
3
#Gemfile
 
gem ‘clearance’

Теперь установите драгоценный камень.

bundle install

На этом этапе выполните команду генератора, чтобы установить clearance .

rails generate clearance:install

Это сгенерирует некоторые выходные данные на вашем терминале, которые выглядят так, как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
create config/initializers/clearance.rb
      insert app/controllers/application_controller.rb
      create app/models/user.rb
      create db/migrate/20161115101323_create_users.rb
 
*******************************************************************************
 
Next steps:
 
1. Configure the mailer to create full URLs in emails:
 
    # config/environments/{development,test}.rb
    config.action_mailer.default_url_options = { host: ‘localhost:3000’ }
 
    In production it should be your app’s domain name.
 
2. Display user session and flashes.
 
    <% if signed_in?
      Signed in as: <%= current_user.email %>
      <%= button_to ‘Sign out’, sign_out_path, method: :delete %>
    <% else %>
      <%= link_to ‘Sign in’, sign_in_path %>
    <% end %>
 
    <div id=»flash»>
      <% flash.each do |key, value|
        <div class=»flash <%= key %>»><%= value %></div>
      <% end %>
    </div>
 
3. Migrate:
 
    rake db:migrate
 
*******************************************************************************

Когда вы запустили команду, в вашем приложении было сгенерировано несколько файлов. Одним из таких файлов является оформление .rb, которое вы можете найти в каталоге config/initializers . Модель User также была сгенерирована, и вместе с этим у вас также есть файл миграции, который выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.timestamps null: false
      t.string :email, null: false
      t.string :encrypted_password, limit: 128, null: false
      t.string :confirmation_token, limit: 128
      t.string :remember_token, limit: 128, null: false
    end
 
    add_index :users, :email
    add_index :users, :remember_token
  end
end

Согласно выводу, первое, что вы хотите сделать, это отредактировать вашу конфигурационную среду. Для этого перейдите в config/environments/development.rb и добавьте строку ниже, чуть выше end разделителя.

1
2
3
  config.action_mailer.default_url_options = { host: ‘localhost:3000’ }
end

Затем перейдите к config/initializers/clearance.rb чтобы отредактировать его, и, когда вы будете там, измените адрес электронной почты отправителя по умолчанию на любой другой по вашему выбору. Это то, что вы увидите, когда откроете файл.

1
2
3
4
5
#config/initializers/clearance.rb
 
Clearance.configure do |config|
  config.mailer_sender = «reply@example.com»
end

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#config/initializers/clearance.rb
 
Clearance.configure do |config|
  config.allow_sign_up = true
  config.cookie_domain = «.example.com»
  config.cookie_expiration = lambda { |cookies|
  config.cookie_name = «remember_token»
  config.cookie_path = «/»
  config.routes = true
  config.httponly = false
  config.mailer_sender = «reply@example.com»
  config.password_strategy = Clearance::PasswordStrategies::BCrypt
  config.redirect_url = «/»
  config.secure_cookie = false
  config.sign_in_guards = []
  config.user_model = User
end

Запустите команду для переноса вашей базы данных.

rake db:migrate

Откройте ваш PagesController и добавьте index действие.

1
2
3
4
5
6
#app/controllers/pages_controller.rb
 
class PagesController < ApplicationController
  def index
  end
end

Затем создайте представление для только что созданного действия с index .

Добавьте фрагмент кода ниже:

1
2
3
4
#app/views/pages/index.html.erb
 
<h1>Tutsplus Clearance</h1>
<p>Welcome to our Clearance Page.</p>

Измените ваши маршруты на:

1
2
3
4
5
#config/routes.rb
 
Rails.application.routes.draw do
  root to: «pages#index»
end

Создайте часть с именем _navigation.html.erb внутри каталога layouts . Это будет использоваться для обработки всего, что связано с навигацией в вашем приложении.

Вставьте следующий код и сохраните.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#app/views/layouts/_navigation.html.erb
 
<nav class=»navbar navbar-inverse»>
  <div class=»container»>
    <div class=»navbar-header»>
      <%= link_to ‘Tutsplus-Clearance’, root_path, class: ‘navbar-brand’ %>
    </div>
    <div id=»navbar»>
    <% if signed_in?
        <ul class=»nav navbar-nav»>
        <li><%= link_to ‘Add Page’, new_page_path %></li>
        </ul>
    <% end %>
 
    <ul class=»nav navbar-nav pull-right»>
        <% if signed_in?
        <li><span><%= current_user.email %>
        <li><%= link_to ‘Sign out’, sign_out_path, method: :delete %></li>
        <% else %>
        <li><%= link_to ‘Sign in’, sign_in_path %></li>
    <% end %>
  </ul>
    </div>
  </div>
</nav>
 
<div class=»container»>
  <% flash.each do |key, value|
    <div class=»alert alert-<%= key %>»>
      <%= value %>
    </div>
  <% end %>
</div>

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

Создайте представление для new действия в app/views/pages , имя файла должно быть new.html.erb . Вставьте код ниже.

1
2
3
4
5
#app/views/pages/new.html.erb
 
<h1>Restricted Page</h1>
 
<p>This page is restricted to authenticated users, if you can see this it means you are a superstar!</p>

Теперь вам нужно добавить строку ниже в config/routes.rb

1
2
3
4
5
#config/routes.rb
 
  resources :pages, only: :new

Наконец, перейдите к вашему PagesController сделайте так, как PagesController ниже.

01
02
03
04
05
06
07
08
09
10
11
#apps/controllers/pages_controller.rb
 
class PagesController < ApplicationController
  before_action :require_login, only: [:new]
   
  def index
  end
 
  def new
  end
end

В приведенном выше коде мы используем помощник Clearance, require_login , чтобы ограничить доступ к new действию. Чтобы увидеть, как это работает, запустите сервер rails, запустив rails server с вашего терминала. Укажите в браузере http://locahost:3000/pages/new и он должен перенаправить вас на страницу входа.

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

01
02
03
04
05
06
07
08
09
10
11
#config/routes.rb
 
Rails.application.routes.draw do
  constraints Clearance::Constraints::SignedOut.new do
    root to: ‘pages#index’
  end
 
  constraints Clearance::Constraints::SignedIn.new do
    root to: «pages#new’, as: :signed_in_root
  end
end

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

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

Чтобы переопределить (или сгенерировать) маршруты очистки, запустите эту команду из своего терминала.

rails generate clearance:routes

Ваш файл маршрутов теперь должен выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#config/routes.rb
 
Rails.application.routes.draw do
  resources :passwords, controller: «clearance/passwords», only: [:create, :new]
  resource :session, controller: «clearance/sessions», only: [:create]
 
  resources :users, controller: «clearance/users», only: [:create] do
    resource :password,
      controller: «clearance/passwords»,
      only: [:create, :edit, :update]
  end
 
  get «/sign_in» => «clearance/sessions#new», as: «sign_in»
  delete «/sign_out» => «clearance/sessions#destroy», as: «sign_out»
  get «/sign_up» => «clearance/users#new», as: «sign_up»
  root to: «pages#index»
  resources :pages, only: :new
end

Команда также установит для параметра config.routes значение false в файле config/initializers/clearance.rb config.routes . Это означает, что будет использоваться только что созданный пользовательский файл.

Чтобы сгенерировать представления для модификации, запустите:

rails generate clearance:views

Некоторые из файлов, которые будут сгенерированы, включают:

1
2
3
4
5
6
7
8
app/views/passwords/create.html.erb
 app/views/passwords/edit.html.erb
 app/views/passwords/new.html.erb
 app/views/sessions/_form.html.erb
 app/views/sessions/new.html.erb
 app/views/users/_form.html.erb
 app/views/users/new.html.erb
 config/locales/clearance.en.yml

Вы увидите подсказку в вашем терминале с просьбой перезаписать файл app/views/layouts/application.html.erb . Выберите нужный вариант.

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

1
2
3
Clearance::PasswordsController.layout «my_passwords_layout»
Clearance::SessionsController.layout «my_sessions_layout»
Clearance::UsersController.layout «my_admin_layout»

Clearance предоставляет вспомогательные методы, которые можно использовать в ваших controllers , views и helpers . Эти методы включают signed_in? signed_out? и current_user . Например:

1
2
3
4
5
6
<% if signed_in?
  <%= current_user.email %>
  <%= button_to «Sign out», sign_out_path, method: :delete %>
<% else %>
  <%= link_to «Sign in», sign_in_path %>
<% end %>

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