WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Deviseを使った認証機能を利用する

      2015/05/24

Deviseの概要

Railsアプリケーションにユーザ管理・認証処理を簡単に組み込むことができるGem。

plataformatec/devise · GitHub

Deviseのインストールと初期設定

インストール

Gemfileに以下を追記して`bundle install`を実行する。

gem 'devise'

初期設定

インストール直後に初期設定を行う必要がある。
以下のコマンドで初期設定を行える。

$ rails generate devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

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

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying Rails 3.1+ on Heroku, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

  5. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================

設定ファイルが自動的に生成される。また、手動で設定すべき事項が示唆されるのでこれも適宜行う。
各項目を簡単に説明すると以下のとおり。

  1. development環境でのメール設定。Deviseにはユーザを生成した際にメール認証を行う機能などがついているが、ローカルでの開発時にメールをうまく飛ばせるように設定を行う必要がある。
  2. Deviseはログイン、アカウントのコンファームやパスワードの変更などを行った後、root :toに指定されたパスにアクセスするのでそのルーティングの設定。
  3. Deviseが生成するflashを出力するためにviewに埋め込むべきタグ
  4. Rails.3.1をHerokuで使っていて、そこにデプロイするときのために設定すべき項目
  5. Deviseが用意しているViewの雛形をコピーするためのコマンド

なお、development環境でのActionMailerのSMTPまわりの設定については以下を参照
development環境でのActionMailerの設定

認証ユーザの生成

Deviseのインストールが完了したら認証情報を保持するModelを以下のコマンドで作成してDBに反映する。

$ rails g devise User
$ rake db:migrate

Deviseのコマンドでモデルを作ると認証に利用するカラムがいくつか追加されている。

Deviseを利用した認証の動作確認

rootとなるリソースの生成

rootとなるリソースの生成を適当に作る。

$ rails g controller home index

生成後は、config/routes.rbでrootとして指定する。

  root :to => "home#index"

flashの出力

app/views/application.html.erb にflashメッセージの表示ロジックを組み込む。

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

ログイン画面へのリンクを設置

`rake routes`を実行するとDeviseによってログイン画面やユーザ管理など様々なrouteが作られていることがわかる。

                    root        /                              home#index
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PUT    /users(.:format)               devise/registrations#update
 

home#indexのビューにログイン画面へのリンクを設置する。

<%= link_to "ログイン", new_user_session_path %>

これでブラウザからログイン画面にアクセスすると、Deviseが用意したログインフォームが出力される。

ユーザがまだいない場合は、new_user_registration_pathにアクセスすることでDeviseが用意したフォームを利用してユーザを生成することができる。
あとは生成したユーザでログインすることができればDeviseの認証システムが正常に動作していることになる。

なお、このようなユーザ生成機能を無効にしたい場合はモデル(この場合はapp/models/user.rb)のdeviseにて:registerableと:recoverableの指定を外す。下記のページが詳しい。
RailsAdmin | Railsで管理画面を自動生成 #Rails #Gems #Ruby #rails_admin_interfaces #rails_admin – Qiita [キータ]

Deviseを利用した認証の動作確認

ログイン中ユーザの取得

ログイン中ユーザの取得はcurrent_userで行える。


class HomeController < ApplicationController def index if current_user # 〜(略)〜 end end end [/ruby]

ログイン前なら nil が返ってくるので、ログイン中のユーザに対してだけ行いたい処理を制御したいときなどに使える。

認証の要求

管理画面など、認証が完了していない場合はアクセスできないリソースではコントローラのbefore_filterにauthenticate_user!を登録することで、認証を要求できる。


class Admin::AdminController < ApplicationController before_filter :authenticate_user! # 〜(略)〜 end [/ruby]

以上が、Deviseで提供される代表的な機能だが他にもいろいろあるみたいなので、時間があったら調べようと思う。

 - Ruby on Rails , , , ,