SSブログ

【Rails(3.2系)開発】deviseを利用して認証処理を作ってみる(導入編) [rails]

仕事で認証システムを作ることになったので、予習・勉強を兼ねてdeviseを使ってみる。

GitHub: devise

ちなみにdeviseとは認証系で一番人気のプラグインで、認証に必要なひと通りの機能(ログイン/ログアウト、アカウント登録、パスワード再発行、など)を網羅する事が出来ます。
また、関連する別のプラグインを組み合わせる事で、role権限やtwitter、facebook認証なども作れるらしいです。


まずはインストールから。
Gemfileに'devise'を記述してbundleでinstallします。
% vim Gemfile
------------------------------------------------
gem 'devise'
------------------------------------------------

% bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/...........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
 (中略)
Installing bcrypt-ruby (3.0.1)
Installing orm_adapter (0.4.0)
Installing warden (1.2.1)
Installing devise (2.2.3)

次にdeviseを使うために必要ファイルをgenerateします。
なおgenerateする時にdatabase.ymlに記述されたDBが起動していないとエラーが発生するので起動を忘れずに。
% bundle exec 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:

       

<%= notice %>

<%= alert %>

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 ===============================================================================

コンソールにsetupに必要な作業が表示されるのでそれを実施します。
% vim my_app/config/environments/development.rb
-----------------------------------------------------------------------
# device
config.action_mailer.default_url_options = { host: 'localhost:3000' }
-----------------------------------------------------------------------

% vim my_app/config/routes.rb
-----------------------------------------------------------------------
# root_path
root to: "top#index"
-----------------------------------------------------------------------

% vim my_app/app/views/layouts/application.html.erb
-----------------------------------------------------------------------


<%-# device -%>

<%= notice %>

<%= alert %>

<%= yield %> ----------------------------------------------------------------------- % bundle exec rails g devise:views invoke Devise::Generators::SharedViewsGenerator create app/views/devise/shared create app/views/devise/shared/_links.erb invoke form_for create app/views/devise/confirmations create app/views/devise/confirmations/new.html.erb create app/views/devise/passwords create app/views/devise/passwords/edit.html.erb create app/views/devise/passwords/new.html.erb create app/views/devise/registrations create app/views/devise/registrations/edit.html.erb create app/views/devise/registrations/new.html.erb create app/views/devise/sessions create app/views/devise/sessions/new.html.erb create app/views/devise/unlocks create app/views/devise/unlocks/new.html.erb invoke erb create app/views/devise/mailer create app/views/devise/mailer/confirmation_instructions.html.erb create app/views/devise/mailer/reset_password_instructions.html.erb create app/views/devise/mailer/unlock_instructions.html.erb # 4.はHerokuで動作させる場合に必要な設定なのでスキップ。

次は認証管理するDBテーブルを作成する。
とりあえずセオリーに従って"User"で作成する。
% bundle exec rails g devise User
      invoke  active_record
      create    db/migrate/20130420134830_devise_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
       route  devise_for :users

db:migrateを実施しDBにテーブルを作成する。

% bundle exec rake db:migrate RAILS_ENV=development
==  DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
   -> 0.0257s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0140s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0132s
==  DeviseCreateUsers: migrated (0.0532s) =====================================

アクセス可能なURLを確認し、WEBrickを起動し動作を確認する。
% bundle exec rake routes
        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
                         DELETE /users(.:format)               devise/registrations#destroy
                    root        /                              top#index

% bundle exec rails server -e development
=> Booting WEBrick
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-04-20 22:54:15] INFO  WEBrick 1.3.1
[2013-04-20 22:54:15] INFO  ruby 1.9.3 (2013-01-15) [x86_64-darwin12.2.1]
[2013-04-20 22:54:15] INFO  WEBrick::HTTPServer#start: pid=19120 port=3000

アクセスしてみる。
http://localhost:3000/users/sign_in

無事に動作を確認出来た。

・・とはいえ、仕事で使う要件以上の機能があったら違ったりして色々とカスタマイズの必要がありそう。
そもそも表示が英語だし

って事で次回から色々とカスタマイズした内容を書いて行きたいと思います。

予定としては、

・日本語化
・Viewのカスタマイズ
・機能の絞り込み
・ログイン/ログアウト後のページ変更
・複数Model対応
・Role権限追加
・Twitter/Facebook認証と連携(仕事関係なしの個人的興味なので優先度低)

な感じで進めて行きます。


【おまけ】Routing Errorが発生してsign_out出来なくなった時の対処法

職場環境だけ出た問題で、自宅では発生しませんでした。
環境/設定などの要因によるかもしれないけど、もし同じ症状が出たら試してみるといいかもです。

ちなみに問題が出たsign_outを行うタグは以下の通り。
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>

自宅・職場共にほぼ同じタグなので書き方は間違ってないと思う。

色々と調べていたら↓の記事を見つけた。どうやらjsの問題らしい。

Rails3+jQueryでデータ削除ができない

エラー画面を見る限りリクエストをGETで投げていたので、同じ症状かもしれないって事でrails.jsを入れてみる。
以下からファイルを取得し、

GitHub: rails / jquery-ujs

上記からrails.jsを取得し、app/assets/javascripts配下に置く。
置いたらファイルを読み込むように設定を変更する。
% vim app/assets/javascripts/application.js
-----------------------------------------------------------------------
//= require jquery
//= require rails   ## <=追加
-----------------------------------------------------------------------

% vim app/config/application.rb
-----------------------------------------------------------------------
# javascript library
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
-----------------------------------------------------------------------

で動くようになりました。
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。