Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

クリアランスを使用したRailsでの認証

クリアランスは、Thoughtbotのチームによって構築された電子メールとパスワードを使用したシンプルな認証システムです。デフォルトについて意見がありますが、簡単に上書きできるようになっています。システムは積極的に維持されており、GitHubでフォローアップできます。

このチュートリアルでは、ClearanceをRailsアプリケーションに統合する方法を説明します。ミニチュアアプリケーションを利用します。さぁ、始めよう!

はじめに

まず、Railsアプリケーションを生成します。このチュートリアルでは、 tutsplus-clearanceという名前を付けます。 。

rails new tutsplus-clearance -T

それで魔法がかかります。

アプリケーションの見栄えを良くするには、ブートストラップが必要です。 BootstrapgemをGemfileに追加します 。

#Gemfile

...
gem 'bootstrap-sass'

bundle installを実行してgemをインストールします 。

次に、 applicationを変更します scss このように見えるように:

#app/assets/stylesheets/application.scss

@import 'bootstrap-sprockets';
@import 'bootstrap';

クリアランス設定

Gemfileを開きます クリアランスジェムを追加します。

#Gemfile

gem 'clearance'

次に、gemをインストールします。

バンドルインストール

この時点で、generatorコマンドを実行して clearanceをインストールします 。

rails generateclearance:install

これにより、端末にいくつかの出力が生成されます。これは、以下のようになります。

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. For example, in your application layout:

    <% 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

*******************************************************************************

コマンドを実行すると、アプリケーションでいくつかのファイルが生成されました。そのようなファイルの1つがclearance.rbで、これは config / initializersにあります。 ディレクトリ。 ユーザー モデルも生成され、それに加えて、次のような移行ファイルもあります:

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 / environment / development.rbに移動します endのすぐ上にある下の行を追加します 区切り文字。

...
  config.action_mailer.default_url_options = { host: 'localhost:3000' }
end

次に、 config / initializers / clearance.rbに移動します 編集し、そこにいるときに、送信者の電子メールアドレスをデフォルトから任意のアドレスに変更します。これは、ファイルを開いたときに表示されるものです。

#config/initializers/clearance.rb

Clearance.configure do |config|
  config.mailer_sender = "reply@example.com"
end

次のコードスニペットを貼り付けて要件に合わせて構成することで、デフォルトの構成を上書きできます。

#config/initializers/clearance.rb

Clearance.configure do |config|
  config.allow_sign_up = true
  config.cookie_domain = ".example.com"
  config.cookie_expiration = lambda { |cookies| 1.year.from_now.utc }
  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を追加します アクション。

#app/controllers/pages_controller.rb

class PagesController < ApplicationController
  def index
  end
end

次に、 indexのビューを作成します 作成したアクション。

以下にコードスニペットを追加します:

#app/views/pages/index.html.erb

<h1>Tutsplus Clearance</h1>
<p>Welcome to our Clearance Page.</p>

ルートを編集して:

#config/routes.rb

Rails.application.routes.draw do
  root to: "pages#index"
end

_navigation.html.erbという名前の部分を作成します layouts内 ディレクトリ。これは、アプリケーションのナビゲーションに関係するすべてを処理するために使用されます。

次のコードを貼り付けて保存します。

#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 %></span></li>
        <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である必要があります 。以下のコードを貼り付けてください。

#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 / routers.rbに追加する必要があります。 。

#config/routes.rb

...
  resources :pages, only: :new
...

最後に、 PagesControllerに移動します 以下のようにしてください。

#apps/controllers/pages_controller.rb

class PagesController < ApplicationController
  before_action :require_login, only: [:new]
  
  def index
  end

  def new
  end
end

上記のコードでは、クリアランスヘルパー require_loginを使用しています。 、 newへのアクセスを制限します アクション。それがどのように機能するかを確認するには、 rails serverを実行してRailsサーバーを起動します ターミナルから。ブラウザでhttp:// locahost:3000 / pages / newを指定します サインインページにリダイレクトされます。

クリアランスは、アクセスを制御するために使用できるルーティング制約も提供します。

#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 generateclearance:routes

ルートファイルは次のようになります。

#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も設定します config / initializers / clearance.rbでfalseに設定する ファイル。これは、生成されたばかりのカスタムファイルが使用されることを意味します。

変更するビューを生成するには、次を実行します:

railsはclearance:viewsを生成します

生成されるファイルには、次のものがあります。

  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がビューをレンダリングするときに使用するレイアウトを変更する場合は、初期化子でレイアウトを指定するだけです。

Clearance::PasswordsController.layout "my_passwords_layout"
Clearance::SessionsController.layout "my_sessions_layout"
Clearance::UsersController.layout "my_admin_layout"

ヘルパーメソッド

クリアランスは、コントローラーで使用できるヘルパーメソッドを提供します 、ビュー 、および helpers 。これらのメソッドには、 signed_in?が含まれます 、 signed_out? 、および current_user 。例:

<% if signed_in? %>
  <%= current_user.email %>
  <%= button_to "Sign out", sign_out_path, method: :delete %>
<% else %>
  <%= link_to "Sign in", sign_in_path %>
<% end %>

結論

クリアランスは認証に関して多くのことを提供するので、次のプロジェクトで試してみてください。詳細については、GitHubページをご覧ください。


  1. Railsのセキュリティの脅威:認証

    このシリーズのパート1、インジェクションアタックについて説明しました OWASPトップ10Webアプリケーションセキュリティリスクに関するシリーズの2番目の記事では、認証の失敗とデータ漏洩の脅威の世界に飛び込みます。 具体的には、ハッカーが作成したコードをだまして攻撃を実行し、ユーザーのデータを取得するのがいかに簡単かについて説明します。 ユーザー列挙 :データベースに存在するかどうかを確認するためだけに、可能性のあるユーザーのリストをブルートフォーステストしてログインページを悪用した場合。 弱いパスワード :システムで弱いパスワードが許可されている場合、ハッカーはブルートフォース攻撃を

  2. Rails5でのAngularの使用

    あなたは前にその話を聞いたことがあります。分散型で完全に機能するバックエンドAPIと、通常のツールセットで作成されたフロントエンドで実行されているアプリケーションがすでにあります。 次に、Angularに移動します。または、AngularをRailsプロジェクトと統合する方法を探しているだけかもしれません。これは、この方法を好むためです。私たちはあなたを責めません。 このようなアプローチを使用すると、両方の世界を活用して、たとえばRailsとAngularのどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた