クリアランスを使用した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ページをご覧ください。
-
Railsのセキュリティの脅威:認証
このシリーズのパート1、インジェクションアタックについて説明しました OWASPトップ10Webアプリケーションセキュリティリスクに関するシリーズの2番目の記事では、認証の失敗とデータ漏洩の脅威の世界に飛び込みます。 具体的には、ハッカーが作成したコードをだまして攻撃を実行し、ユーザーのデータを取得するのがいかに簡単かについて説明します。 ユーザー列挙 :データベースに存在するかどうかを確認するためだけに、可能性のあるユーザーのリストをブルートフォーステストしてログインページを悪用した場合。 弱いパスワード :システムで弱いパスワードが許可されている場合、ハッカーはブルートフォース攻撃を
-
Rails5でのAngularの使用
あなたは前にその話を聞いたことがあります。分散型で完全に機能するバックエンドAPIと、通常のツールセットで作成されたフロントエンドで実行されているアプリケーションがすでにあります。 次に、Angularに移動します。または、AngularをRailsプロジェクトと統合する方法を探しているだけかもしれません。これは、この方法を好むためです。私たちはあなたを責めません。 このようなアプローチを使用すると、両方の世界を活用して、たとえばRailsとAngularのどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた