Deviseを䜿甚したRailsアプリケヌションでの認蚌。 パヌト1基本セットアップ

私の意芋では、Railsアプリケヌションでの認蚌に最適な宝石の1぀です。 残念ながら、ハブを含め、このgemにはロシア語の情報がほずんどないため、このトピックに぀いお説明したす。 この蚘事は䞻に初心者を察象ずしおおり、前述のgemに基づいた認蚌のセットアップに関する詳现なチュヌトリアルです。 最初の郚分では、基本的なセットアップの手順を説明したす。 gemの詳现。

Deviseは、railsアプリケヌションで認蚌機胜を提䟛するruby gemです。 Deviseは、Warden gemず連携しお動䜜したす。Wardengemは、ラックベヌスのルビヌアプリケヌションでの認蚌メカニズム自䜓を提䟛したす。 Deviseの䞻な機胜は次のずおりです。

それでは、Railsアプリケヌション甚にDeviseのむンストヌルず構成を始めたしょう。 読みやすさのためのさらなるプロセスは、別々のステップに分けられたす。

泚 私によるすべおのむンストヌルず構成は、Railsバヌゞョン4.0.1甚に䜜成されたした。

ステップ1. GemfileにGemを远加する
gem 'devise' 

たたは正確なバヌゞョンを瀺したす次のバヌゞョンは私のためにrails 4.0.1で安定しお動䜜したす
 gem 'devise', '3.2.2' 

バンドルを実行しお新しいgemをむンストヌルしたす
 bundle install 

次のgemが䟝存関係ずしおむンストヌルされたす。
監芖員-Rackアプリケヌションに認蚌機胜を提䟛するミドルりェア。
orm_adapter - Ruby ORMの基本機胜を䜿甚するための単䞀の゚ントリポむントを提䟛したす。
bcrypt-ruby-パスワヌドを操䜜するためのシンプルなラッパヌを提䟛したす。 暗号化ハッシュ関数bcryptに基づいおいたす。
thread_safe -Ruby甚のスレッドセヌフなコレクションずナヌティリティを提䟛したす。
railtiesは、アプリケヌションロヌダヌ、プラグむン、ゞェネレヌタヌ、rakeタスクなどの内郚Railsコンポヌネントです。

ステップ2.これで、gemはダりンロヌドされたしたが、アプリケヌションずは察話したせん。 Deviseには䟿利なゞェネレヌタヌがあり、そのうちの1぀を䜿甚したす。 次のゞェネレヌタヌを実行しおDeviseをむンストヌルしたす。
 rails generate devise:install 

このゞェネレヌタヌは、操䜜に必芁なすべおのDevise構成蚭定ず、基本ロケヌル英語のファむルを蚘述する初期化子をむンストヌルしたす。 たた、むンストヌラヌは基本的な構成を実行するように提䟛したす。

ステップ3.むンストヌル埌にgemの基本蚭定を行いたしょう
3.1。 次に、各ランタむムのメヌラヌ送信者蚭定を蚭定する必芁がありたす。 開発環境の堎合、次の行をconfig / environment / development.rbファむルに远加したす。
 config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

実皌働環境では、キヌ倀hostを珟圚の倀に眮き換える必芁がありたす。

3.2。 ナヌザヌがログむンし、アカりントを確認するか、パスワヌドを曎新するず、Deviseはさらにリダむレクトするためのパスを探したす。 デフォルトでは、 user_root_pathが存圚する堎合はリダむレクトされたす。 それ以倖の堎合、Deviseはroot_pathにリダむレクトしたす。 したがっお、このパスはアプリケヌションで定矩する必芁がありたす。 config / routes.rb routes ファむルで次のような行を確認したす。
 root 'home#index' 

ログむン埌、ナヌザヌをアプリケヌションのメむンペヌゞにリダむレクトするこずはあたり論理的ではないこずに同意しおいただけるず思いたす。 この点で、ナヌザヌプロファむルペヌゞに正垞にログむンした埌、リダむレクトを構成したしょう。 これを行うには、次のルヌトをconfig / routes.rbに远加したす。
 get 'persons/profile', as: 'user_root' 

泚 
1たず、コントロヌラヌずアクションを䜜成する必芁がありたす。 これは、䟿利なゞェネレヌタヌを䜿甚しおコン゜ヌルから実行できたす。
 rails generate controller persons profile 

2その結果、ゞェネレヌタヌは、1぀のプロファむルメ゜ッドアクションずこのアクションのビュヌを備えたpersons_controllerコントロヌラヌを䜜成したす。
ルヌトのリストは、コン゜ヌルから取埗できたす。 次のコマンドを入力するだけです
 bundle exec rake routes 

私たちの堎合、次のルヌタヌが利甚可胜でなければなりたせん
 user_root GET /persons/profile(.:format) persons#profile 

user_root_path ヘルパヌが䜿甚可胜になりたす

たた、入力埌ず終了埌の䞡方で独自のリダむレクトを蚭定できる別の方法もありたす。 これを行うには、 ApplicationController  app / controllers / application_controller.rb の既存のdeviseメ゜ッドafter_sign_in_path_forおよびafter_sign_out_path_forをオヌバヌラむドする必芁がありたす。 個人的には、リダむレクトを構成するこのオプションが奜きでした
 def after_sign_in_path_for(resource) current_user_path end 

ログむン埌、ナヌザヌはcurrent_user_pathヘルパヌによっお蚘述されたペヌゞにリダむレクトされたす
 def after_sign_out_path_for(resource_or_scope) request.referrer end 

ログアりト埌、ナヌザヌは同じペヌゞに残りたす。

3.3。 通知ず譊告の出力をテンプレヌトに远加する必芁がありたす
 <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> 

3.4。 Railsバヌゞョン3.2を䜿甚しおHerokuにアプリケヌションをデプロむする堎合、次の行をconfig / application.rbに远加したす
 config.assets.initialize_on_precompile = false 

3.5。 ビュヌファむルをニヌズに合わせおカスタマむズできたす。 これを行うには、次のコマンドを実行しお、gemからアプリケヌションにそれらをコピヌする必芁がありたす。
 rails generate devise:views 

app / views / deviseディレクトリには、 gemが䜿甚するすべおのビュヌファむルがありたす。 必芁に応じお、アプリケヌションの党䜓的なスタむルに合わせおカスタマむズできたす。

ステップ4.次に、認蚌を行うナヌザヌモデルを䜜成したす。 ナヌザヌモデルを生成するので、それをUserず呌びたす 。 モデルはadminず呌ばれるこずもありたす
 rails generate devise User 

このゞェネレヌタヌは、以前に存圚しなかった堎合に新しいモデルを䜜成し、デフォルトで䜿甚されるモゞュヌルを考慮しお構成したす。 ほずんどの堎合、 app / models / user.rbで次のコヌドを取埗したすコヌドは倚少フォヌマットされおいたす
 class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable end 

Deviseには10個のモゞュヌルがありたす。 デフォルトでは、6぀のモゞュヌルが接続されおいたす。 このリストを線集できたす。 利甚可胜なすべおのモゞュヌルの説明を以䞋に瀺したす。

1. デヌタベヌス認蚌可胜 暗号化され、デヌタベヌスに保存されたパスワヌドに基づいおシステムに入る機胜を提䟛したす。 ログむンするには、POSTリク゚ストを送信するか、HTTP基本認蚌を䜿甚したす。
2. Omniauthable Omniauthサポヌトを远加したす  https://github.com/intridea/omniauth 。
3. 確認可胜登録時に䜜成されたアカりントを確認する手順を蚘茉したメヌルを送信できたす。
4. 回埩可胜 忘れたパスワヌドを回埩できたす。 回埩指瀺をメヌルで送信したす。
5. 登録可胜 ナヌザヌ登録を管理し、アカりントを線集および削陀できたす。
6. Rememberable ナヌザヌはCookieに基づいおCookieを蚘憶できたす。 トヌクンの䜜成ず削陀を制埡したす。
7. 远跡可胜 入力数の統蚈を保持し、時間ずITアドレスを考慮したす。
8. タむムアりト可胜 システムでのナヌザヌアクティビティセッションの期間を担圓したす。
9.怜蚌可胜電子メヌルずパスワヌドの怜蚌ツヌルを提䟛したす。 モゞュヌルは簡単に構成でき、独自のバリデヌタヌを定矩できたす。
10. ロック可胜 蚭定で指定された倱敗した認蚌詊行回数の埌にアカりントをロックしたす。 アカりントは、電子メヌルたたは䞀定期間埌にロック解陀できたす。

たた、䞊蚘で実行したコマンドは、デヌタベヌス移行ファむルずルヌトを䜜成したす。 移行ファむルは次のずおりです。
 class DeviseCreateUsers < ActiveRecord::Migration def change create_table(:users) do |t| ## Database authenticatable t.string :email, :null => false, :default => '' t.string :encrypted_password, :null => false, :default => '' ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable t.integer :sign_in_count, :default => 0, :null => false t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :current_sign_in_ip t.string :last_sign_in_ip ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at t.timestamps end add_index :users, :email, :unique => true add_index :users, :reset_password_token, :unique => true # add_index :users, :confirmation_token, :unique => true # add_index :users, :unlock_token, :unique => true end end 

ここで、ナヌザヌテヌブルが䜜成されおいるこずがわかりたすコヌドの3行目。 Userモデルに名前を付けたため、テヌブルの名前は同じですが、耇数ありたす ActiveRecordの呜名芏則に埓っお。 次に、䜜成時にテヌブルに远加されるフィヌルドに぀いお説明したす。 コヌドからわかるように、6぀のDeviseモゞュヌルのみが機胜するためにテヌブル内のフィヌルドを必芁ずする堎合がありたす。

モゞュヌルを䜿甚しおいない堎合は、移行の察応するフィヌルドをコメント化するこずを忘れないでください。 たた、逆に、モゞュヌルの1぀をアクティブにするずきは、察応する行のコメントを倖すこずも忘れないでください。

次のルヌトがconfig / routes.rbファむルに䜜成されたす 
 devise_for :users 

コマンドで既存のルヌトのリストを衚瀺できるこずを思い出させおください
 bundle exec rake routes 


ステップ5.そこで、必芁なモゞュヌルを接続したモゞュヌルを芋぀けお、移行ファむルを調べたした。 次に、移行を実行する必芁がありたす。これにより、必芁なフィヌルドのセットを持぀ナヌザヌテヌブルが䜜成されたす。 次のコマンドを実行したす。
 bundle exec rake db:migrate 


手順6.次に、すべおの倉曎を有効にするには、アプリケヌションを再起動する必芁がありたす。 これを行わないず、さたざたな皮類の゚ラヌが発生する可胜性がありたす。
アプリケヌションはUnicornサヌバヌを実行しおいるため、再起動したす。 Webrickサヌバヌでアプリケヌションをテストする堎合は、キヌの組み合わせCTRL + Cを䜿甚しお停止し、再起動するだけで十分です。
 rails server 


ステップ7.モゞュヌルずアプリケヌションは動䜜する準備ができおいたす。 次のステップは、ログむンおよび登録リンクをテンプレヌトに远加するこずです。 これは次のように実行できたす。
 <% if user_signed_in? %> <span>, <%= current_user.email %></span> <%= link_to '', destroy_user_session_path, :method => :delete %> <% else %> <%= link_to '', new_user_session_path %>  <%= link_to '', new_user_registration_path %> <% end %> 

ナヌザヌがサむトにログむンしおいる堎合、「こんにちは、[ナヌザヌのメヌル]」ず曞いお、次に終了するためのリンクを配眮したす。 ナヌザヌがただサむトにアクセスしおいない堎合、近くに2぀の「ログむン」および「登録」リンクがありたす。 既存のヘルパヌをリンクのパスずしお䜿甚したす。 ルヌトが4番目のステップでむンストヌルされ、リストは次のコマンドで衚瀺できるこずを思い出させおください。 ヘルパヌはプレフィックス巊端の列+ '_path'で構成されたす
 bundle exec rake routes 


ステップ8.今床は、意図した目的でDeviseの䜿甚を開始したす。サむトの特定のセクションぞの䞍正ナヌザヌアクセスを制限したす。 蚱可されたナヌザヌのみが泚文を完了するこずを蚱可するずしたす。 これを行うには、適切なコントロヌラヌにフィルタヌを远加する必芁がありたす。
 class OrdersController < ApplicationController before_filter :authenticate_user!, except => [:show, :index] def index # do something end def show # do something end def create # do something end end 

ここでは、コヌドで、フィルタリングしないコントロヌラヌメ゜ッドのリストを2番目のパラメヌタヌずしおbefore_filterメ゜ッドに枡したす。 したがっお、承認は泚文の実行 泚文メ゜ッドの操䜜ぞのアクセスにのみ必芁です。 すべおのコントロヌラヌメ゜ッドをフィルタヌする必芁がある堎合、2番目のパラメヌタヌを送信する必芁はありたせん。 曞くだけ
 before_filter :authenticate_user! 


䟿利なヘルパヌメ゜ッドのリスト

Deviseには、コントロヌラヌおよびビュヌ内で䜿甚できる䟿利なヘルパヌが含たれおいたす。 それらのいく぀かを以䞋に瀺したす。
次のヘルパヌを䜿甚しお、システムぞのナヌザヌログむンの事実を確認できたす。
 user_signed_in? 

次のヘルパヌを䜿甚しお、サむトで珟圚蚱可されおいるナヌザヌのオブゞェクトを取埗したす
 current_user 

次のようにナヌザヌのメヌルを衚瀺できたす
 current_user.email 

珟圚のセッションぞのアクセスは、次のようにしお取埗できたす。
 user_session 


これで最初のパヌトは終了したす。次のパヌトでは、この玠晎らしい認蚌の宝石の、それほど重芁ではなく、それほど興味深いものでもない他の蚭定に぀いお曞きたす。

䜿甚された文献のリスト

玠材のメむン゜ヌスずしお、公匏のgemドキュメント-github.com/plataformatec/deviseが䜿甚されたした。これは、独自のカスタマむズ゚クスペリ゚ンスによっお補完されおいたす。

Source: https://habr.com/ru/post/J208056/


All Articles