クリアランスを使用した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 = "[email protected]" 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 = "[email protected]" 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のどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた