2011年12月12日月曜日

devise を使う

ちょっと前に Rails + OmniAuth + OAuth on Twitter/Facebook でユーザ認証のサンプルを作ってみたのですが、認証に関する便利な仕組みとして Devise というのを知ったのでそちらを使ってみることにしました。

なお、OmniAuth との連携については wiki ページに情報があります。
最終的には OmniAuth との連携の形に持っていきたいと思います。

まず最初に

https://github.com/plataformatec/devise の Installation の項目にある部分:
  • Devise の gem のインストール
  • Gemfile への追記: gem 'devise'
  • rails g devise:install
  • rails g devise user
  • rails g devise:views
までを行いました。
"rails g devise:install" の後にメッセージが出ます。要約すると:
  1. config.action_mailer.default_url_options を設定せよ
    • config/environments/development.rb だと、"{ :host => 'localhost:3000' }" とか
  2. config/routes.rb にて、root_url を設定(root :to を定義)せよ
    • トップページを表現する適当な controller を用意して、"...#index" とかにしておけば良いはず
  3. app/views/layouts/application.html.erb (つまり global_layout)で notice, alert が表示されるようにせよ
    • こんな感じ。"<p class="notice"><%= notice %></p>"
  4. heroku 上にデプロイする場合には、config/application.rb にて config.asset.initialize_on_precompile = false を宣言せよ
の4点です。
この devise:install 時のメッセージに従って作業すると1/3位の設定が終わります。

もう一つの準備

とりあえず「認証によって保護されるリソース」 を考えないと認証の意味が無いので、todo モデルを作っておきます。
rails g scaffold todo summary:string content:text importance:integer rake db:migrate
この todo を、認証した user だけがアクセスできるようにします。

リソースの保護

リソース todo へのアクセスを認証で制御するには、
  1. app/controllers/todos_controller.rb の修正
    • before_filter :authenticate_user!
  2. routes.rb の修正
    • devise_for :users
とします。
また、ログイン情報入力のための画面を用意した場合、
  • ログインしていないなら、ログイン情報入力画面
  • ログイン済みなら、 ログイン後のトップ画面
のような構成を作りたいと思います。
このような時には devise で提供されている current_user メソッドを使って、
class PortalController < ApplicationController
  def index
    if current_user
      redirect_to :user_root
      return
    end
  end
end
のようなことができます。

0 件のコメント:

コメントを投稿