【Rails(3.2系)開発】deviseを利用して認証処理を作ってみる(導入編) [rails]
仕事で認証システムを作ることになったので、予習・勉強を兼ねてdeviseを使ってみる。
GitHub: devise
ちなみにdeviseとは認証系で一番人気のプラグインで、認証に必要なひと通りの機能(ログイン/ログアウト、アカウント登録、パスワード再発行、など)を網羅する事が出来ます。
また、関連する別のプラグインを組み合わせる事で、role権限やtwitter、facebook認証なども作れるらしいです。
まずはインストールから。
Gemfileに'devise'を記述してbundleでinstallします。
次にdeviseを使うために必要ファイルをgenerateします。
なおgenerateする時にdatabase.ymlに記述されたDBが起動していないとエラーが発生するので起動を忘れずに。
コンソールにsetupに必要な作業が表示されるのでそれを実施します。
次は認証管理するDBテーブルを作成する。
とりあえずセオリーに従って"User"で作成する。
アクセス可能なURLを確認し、WEBrickを起動し動作を確認する。
アクセスしてみる。
http://localhost:3000/users/sign_in
無事に動作を確認出来た。
・・とはいえ、仕事で使う要件以上の機能があったら違ったりして色々とカスタマイズの必要がありそう。
そもそも表示が英語だし
って事で次回から色々とカスタマイズした内容を書いて行きたいと思います。
予定としては、
・日本語化
・Viewのカスタマイズ
・機能の絞り込み
・ログイン/ログアウト後のページ変更
・複数Model対応
・Role権限追加
・Twitter/Facebook認証と連携(仕事関係なしの個人的興味なので優先度低)
な感じで進めて行きます。
【おまけ】Routing Errorが発生してsign_out出来なくなった時の対処法
職場環境だけ出た問題で、自宅では発生しませんでした。
環境/設定などの要因によるかもしれないけど、もし同じ症状が出たら試してみるといいかもです。
ちなみに問題が出たsign_outを行うタグは以下の通り。
自宅・職場共にほぼ同じタグなので書き方は間違ってないと思う。
色々と調べていたら↓の記事を見つけた。どうやらjsの問題らしい。
Rails3+jQueryでデータ削除ができない
エラー画面を見る限りリクエストをGETで投げていたので、同じ症状かもしれないって事でrails.jsを入れてみる。
以下からファイルを取得し、
GitHub: rails / jquery-ujs
上記からrails.jsを取得し、app/assets/javascripts配下に置く。
置いたらファイルを読み込むように設定を変更する。
で動くようになりました。
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) -----------------------------------------------------------------------
で動くようになりました。
コメント 0