おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

deviseでユーザー認証を実装した

Rails4でdeviseを使ってユーザー認証システムを試してみた時のメモ。

deviseとは(・・?)

deviseはrailsでユーザー認証をフレキシブルに導入できる超便利なgemらしいです。

deviseの設定

まず、あらかじめrails_testプロジェクトを作成しておく。

rails new devise_test

そしてGemfile中に以下を追加し、インストールを行う。

# Use devise as Authentication System
gem 'devise'
bundle install

そして以下のコマンドでdeviseのセットアップを行う。

rails g devise:install
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', port: 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 on Heroku with Rails 3.2 only, 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

成功すると上記のような5つのことをやりましょうという旨のメッセージが出てくるのでそれに従っていく。

1.config/enviroments/development.rb中に以下を追記する。

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

2.ルートのルーティングを設定する。例えばconfig/routes.rbに以下を追記する。

root 'home#index'

3.app/views/layouts/application.html.erb中に以下を記述し、警告メッセージの領域を確保する。

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

4.はHerokuでrails3.2を使う場合にのみ必要な設定なのでここではスキップする。

5.最後に以下を実行することでユーザー認証などを行うviewが作られる。

rails g devise:views

モデル作成

devise用のUserモデルを作成する。

rails g 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つのモジュールが有効になっている。
必要に応じてコメントイン・アウトする。とりあえずこのままにしておく。

次にmigrateファイルを見ていく。先ほどのモデルでモジュール追加などをした場合は必要に応じてマイグレーションファイルのコメントも外す必要がある。ここでは特に変更はせずにマイグレーションを行う。

rake db:migrate

先ほどroot_pathに設定した'home/index'を作成する。

rails g controller Home index

そして、最後に先ほど作成したdeviseのview群にアクセスするためのリンクを作る。
今回はapp/layouts/appliction.html.erbに追加する。

<!DOCTYPE html>
<html>
<head>
  <title>DeviseTest</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

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

<% if user_signed_in? %>
  <%= link_to 'プロフィール変更', edit_user_registration_path %>
  <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
<% else %>
  <%= link_to 'ログイン', new_user_session_path %>
  <%= link_to 'ユーザー新規作成', new_user_registration_path %>
<% end %>

<%= yield %>

</body>
</html>

上記のコードでは、ログインしていない場合はログインまたはユーザーの新規作成用のリンクが表示され
ログインしている場合はプロフィールの変更またはログアウトのリンクが表示されるようになる。

rails s

サーバーを起動し、ルートにアクセスする。

f:id:orange_lily27:20150716163900p:plain

リンク先

ログインやログアウトなどそれぞれのリンク先はrake routesで確認できる。

 Prefix Verb   URI Pattern                    Controller#Action
              home_index GET    /home/index(.:format)          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
                         PATCH  /users/password(.:format)      devise/passwords#update
                         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
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                    root GET    /                              home#index

sessions関連がユーザーのログイン、ログアウトの面倒をみている。
registrationsがユーザ新規作成や編集、削除のリンク先となっている。

ヘルパー

deviseではあらかじめ便利なヘルパーたちが用意されている。

  • コントローラーに記述するとユーザーがログインしていない場合アクセスが出来なくなり、ログイン画面にリダイレクトされる
before_action :authenticate_user!
  • ユーザーがログインしているかの確認(userの部分はモデル名)
user_signed_in?
  • ログインしているユーザのオブジェクト取得(userの部分はモデル名)
current_user

参考