SonicGarden Study#3 – 今日のテーマ – Deviseとは?



SonicGarden Study#3 – 今日のテーマ – Deviseとは?

0 0


sg_study_vol3_slide


On Github maedana / sg_study_vol3_slide

SonicGarden Study#3

はじめに

  • このスライドやサンプルアプリのコードは後ほど公開します。
  • Twitterのハッシュタグ = #sg_study
    • 質問も#sg_studyでどうぞ
    • 本編の最後でまとめて回答します

今日のテーマ

http://devise.plataformatec.com.br

内容のレベル

Ruby RailsをかじったことがあってこれからWebアプリを作りたい人向けぐらいの内容です。 Ruby Railsをかじった今年度の新入社員向けぐらい?

Webアプリケーションを作る上で割けては通れないログイン機能を経験の浅いプログラマでも比較的安全かつ簡単に作れる、かもしれません

バリバリRailsで開発されている方がいらっしゃっても物足りないレベルの内容ですのでご了承下さい

進め方

  • 最初に簡単にDeviseとは何かについて話します(5分程度)
  • 次に実際にDeviseを使って認証機能を組む込むデモをします(10分から15分程度)
  • Deviseで生成された実際のコードや、設定に関する解説をします(20分程度)
  • 質疑応答(5分から10分程度)

Deviseとは?

Deviseの概要

  • Railsアプリに簡単に認証機構を組み込むためのgem
  • wardenというgemが基盤。ですが今日は触れません。
  • Deviseは用途によって異なる11種類のモジュールを必要に応じて読み込んで利用する構造になっています。

デモ

  • rubyは1.9.3
  • Railsは3.2.14
いずれも最新ではないですが、僕自身が今のところ一番手に馴染んでる組み合わせですので。

デモの流れ

Railsアプリの作成 トップページの作成 Deviseのインストール モデルの作成 認証をかける ログアウトを追加

Railsアプリの作成

% rails new sg_study_vol3 -T
% cd sg_study_vol3
% bundle exec rake db:create
% rails s -p 3000

トップページの作成

% rm public/index.html
% rails g controller home index
# index.html.erbの中身をわかりやすく変更しておく
% echo '<h2>Welcome to SG Study Vol#3</h2>' > app/views/home/index.html.erb
config/routes.rb
            root :to => "home#index"

Deviseのインストール

Gemfile
            # 最新のdevise 3.0系だとrails3.2系で動かないのでバージョン指定
gem 'devise', '~> 2.2.4'
% bundle
% rails g devise:install
config/environments/development.rb
            config.action_mailer.default_url_options = { :host => 'localhost:3000' }
app/views/layouts/application.html.erb
            <p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

モデルを作成

% rails g devise user
% bundle exec rake db:migrate

認証をかける

app/controllers/application_controller.rb
            class ApplicationController < ActionController::Base
  protect_from_forgery
  # ↓を追加
  before_filter :authenticate_user!
end

ログアウトを追加

app/views/layouts/application.html.erb
            <% if user_signed_in? %>
  <%= link_to 'Sign Out', destroy_user_session_path, method: :delete %>
<% end %>

デモアプリ解説

rails g devise:install

  • config/locales/devise.en.yml
  • config/initializers/devise.rb

config/locales/devise.en.yml

I18n、国際化のためのファイル。日本語リソースはconfig/locales/devise.ja.ymlを作って翻訳すると日本語化されます。 日本語リソースは有志で作っている人がいるので探せばすぐ見つかるし、自分で翻訳するのもいいでしょう。

config/initializers/devise.rb

Deviseの設定ファイルです。 大きく17箇所に分類された設定になっています。

config/initializers/devise.rbの分類1

  • Mailer Configuration
  • ORM configuration
  • Configuration for any authentication mechanism
  • Configuration for :database_authenticatable
  • Configuration for :confirmable
  • Configuration for :rememberable
  • Configuration for :validatable
  • Configuration for :timeoutable
  • Configuration for :lockable
  • Configuration for :recoverable
  • Configuration for :encryptable
  • Configuration for :token_authenticatable

config/initializers/devise.rbの分類2

  • Scopes configuration
  • Navigation configuration
  • OmniAuth
  • Warden configuration
  • Mountable engine configurations

rails g devise user

  • config/routes.rb
  • db/migrate/xxxx_devise_create_users.rb
  • app/models/user.rb

config/routes.rb

devise_for :users

特殊なことをしないのであればこの記述のままで大丈夫

db/migrate/xxxx_devise_create_users.rb

利用するモジュールに合わせて変更が必要 例えば、Confirmableを使うなら以下をコメントアウト

## Confirmable
# t.string   :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string   :unconfirmed_email # Only if using reconfirmable

# add_index :users, :confirmation_token,   :unique => true

app/models/user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  # attr_accessible :title, :body
end
  • 11種類のうちどのモジュールを使うかを指定。
  • 標準以外でよく使うのはconfirmable, omuniauthableあたり
  • confirmableはメールで本人確認するためのモジュール
  • omniauthableはominiauthを組み込んでTwitterやFacebookなどとOAuth連携するためのモジュール。今回の範囲を越えるので詳細は割愛

Deviseの11のモジュール

Database Authenticatable

パスワードをデータベースに暗号化して保存。 (標準設定のままなら)メールアドレス、パスワードで認証をする機構を組み込むモジュール

Token Authenticatable

トークン認証で認証する機構を組み込むモジュール。

Omuniauthable

OmniauthというOAuth連携の際によく利用されるgemをdeviseと組み合わせる時に使うモジュール。Twitter連携とかFacebook連携などを使う時に必要になってくるが、今回は対象外なので割愛

Confirmable

本人認証のためにメールを飛ばして、メールリンクをクリックすることで本登録とするよくあるフローを実現するためのモジュール

Recoverable

パスワードをリセットし、リセットの指示を送る機構を組み込むモジュール。パスワード忘れ機能などに利用

Registerable

ユーザ登録/編集/削除出来るようにするモジュール。管理者が一括でユーザ登録するようなアプリの場合は使わない

Rememberable

次回から自動的にログインする機能を有効にするときに使うモジュール

Trackable

ログイン回数、ログイン日時・IPアドレスをトラッキングする機構を組み込むモジュール

Timeoutable

一定時間操作がない場合にログインセッションを自動的に破棄させる機構を組み込むモジュール

Validatable

メールアドレス、パスワードの妥当性チェックを組み込むモジュール

Lockable

一定回数ログインに失敗するとアカウントを凍結する機構を組み込むモジュール。メール、または一定時間で自動的に解除可能

個人的によく使う組み合わせ

Devise標準(Database Authenticatable / Registerable / Recoverable / Rememberable / Trackable / Validatable )

+

Confirmable

よくある質問

Q: ログイン画面などViewのカスタマイズはどうしたらいいでしょうか

A: rails g devise:views

Q: Controllerのカスタマイズはどうしたらいいでしょうか?

A: deviseのgemディレクトリ/app/controllers/devise配下のcontrollerを継承して必要な箇所をOverride。初級レベルでは難しいかもしれません。

Q: より詳しい情報はどこを見たらいいでしょうか?

A: http://devise.plataformatec.com.br

A: https://github.com/plataformatec/devise/wiki

質疑応答

(注)マニアックな質問には答えられない可能性があります。あらかじめ御了承下さい

おしまい

by maedana