SSブログ

【Rails(3.2系)開発】deviseを利用して認証処理を作ってみる(機能絞り込み) [rails]

これまでに引き続きdeviseプラグインを利用した認証処理について。

・【Rails(3.2系)開発】deviseを利用して認証処理を作ってみる(導入編)
・【Rails(3.2系)開発】deviseを利用して認証処理を作ってみる(日本語化)

今回は機能の絞り込みを行います。

実際にインストールして色々と触ってみるとわかると思いますが、deviseを使うと認証に必要なひと通りの機能を有しています。
要件が全ての機能を必要とする案件であれば問題ないのですが、だいたいの場合はこの中から2,3の機能で事足りてしまうと思います。

単純に使わないのであれば、入り口となるリンクを閉じて対象のロジックを走らせないようにすればいいのですが、それだと直接URLを叩けば見れてしまいます。
deviseプラグインでは機能のカテゴリ単位となりますが必要としない機能を利用しない方法もあるので、それを利用して必要以外の機能を利用しないように絞りたいと思います。

まずはdeviseが提供している機能をrake routesコマンドを利用して見てみます。
% 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

とりあえず最低限の機能ということでログイン・ログアウト機能以外を削除します。

機能を絞るにはconfig/routes.rbを変更します。
% vim config/routes.rb
--------------------------------------------------------------------------------
MyApp::Application.routes.draw do
  devise_for :users
  (中略)
end
--------------------------------------------------------------------------------

deviseで提供されているURLは、この"devise_for :users"の1行で生成されています。
機能を絞るためにはオプションで":only"、または":skip"パラメータを付けて制限します。

> :only [使いたい機能]
> :skip [省きたい機能]

どちらも結果的には同じになるし、好みに応じて利用すればいいと思います。
ただし、":only"と":skip"の両方のオプションが指定された場合は":only"が優先されます。
# 参考
% vim vendor/bundle/ruby/1.9.1/gems/devise-2.2.3/lib/devise/mapping.rb
--------------------------------------------------------------------------------
def default_used_route(options)
  singularizer = lambda { |s| s.to_s.singularize.to_sym }

  if options.has_key?(:only)
    @used_routes = self.routes & Array(options[:only]).map(&singularizer)
  elsif options[:skip] == :all
    @used_routes = []
  else
    @used_routes = self.routes - Array(options[:skip]).map(&singularizer)
  end
end
--------------------------------------------------------------------------------

ログイン・ログアウト機能のみを利用できるようにしたいので、":only"パラメータに":sessions"を指定します。
% vim config/routes.rb
--------------------------------------------------------------------------------
MyApp::Application.routes.draw do
  devise_for :users, only: [:sessions]
  (中略)
end
--------------------------------------------------------------------------------

"rake routes"でURLを確認します。
% 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

":skip"オプションでも同様の事をやってみます。
必要ない機能を指定する必要があるので、"passwords"と"registrations"を指定します。
% vim config/routes.rb
--------------------------------------------------------------------------------
MyApp::Application.routes.draw do
  devise_for :users, skip: [:passwords, :registration]
  (中略)
end
--------------------------------------------------------------------------------

"rake routes"でURLを確認します。
% 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

これでカテゴリ単位では絞ることが出来ました。

なお、カテゴリより狭い範囲の各URLごとに絞る事も出来ます。
若干記述が面倒になりますが "skip:"オプションにあえて":all"パラメータを指定し、ブロック内でURLを再定義する事で制御できます。
% vim config/routes.rb
--------------------------------------------------------------------------------
MyApp::Application.routes.draw do
  devise_for :users, skip: :all do
    post   '/users/sign_in(.:format)',
      to: 'devise/sessions#create', as: :user_session
    delete '/users/sign_out(.:format)',
      to: 'devise/sessions#destroy', as: :destroy_user_session
    get    '/users/password/edit(.:format)',
      to: 'devise/passwords#edit', as: :edit_user_password
    delete '/users(.:format)',
      to: 'devise/registrations#destroy', as: :edit_user_registration
  end
  (中略)
end
--------------------------------------------------------------------------------

routesを確認します。
% bundle exec rake routes
          user_session POST   /users/sign_in(.:format)       devise/sessions#create
  destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
    edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
edit_user_registration DELETE /users(.:format)               devise/registrations#destroy

URLを再定義しているので、独自にURLやルート名を振れる事も出来ます。

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

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