Acts as authenticated 体験記 その5【ログイン許可・不許可】
その1【取り敢えずインストール】
その2【必要ファイルを自動生成】
その3【画面表示を見てみる】
その4【日本語化をしてみる】
その5【ログイン許可・不許可】
その6【まとめ】
今回は、ページごとに、ログインを許可したり不許可にしたりするのはどーやるの?という疑問を解決したいと思います。
ちょっくら調べてみると、やり方が 2 通り見つかりました。
1. コントローラの各アクションごとに logged_in? メソッドを使って調べる
2. コントローラごとに before_filter や skip_before_filter を使って指定する
まず、
1. コントローラの各アクションごとに logged_in? メソッドを使って調べる
これなのですが、コントローラのアクションごとに、logged_in? メソッドを使って、ユーザがログインしている時としていない時の動作を自分で書きます。
例えば、account コントローラのアクションが 3 つあったとします。action1, action2, action3 という名前にします。
action1 (http://localhost:3000/account/action1)
は、ログインしていてもしていなくても見られるページ
action2 (http://localhost:3000/account/action2)
は、ログインしていないと、action1 に飛ばします。ログインしていると見られます。
action3 (http://localhost:3000/account/action3)
は、ログインしいないと見られます。ログインしていると action2 に飛ばします。
みたいなことをしたいと思ったら、以下のようになります。
app/controllers/account_controller.rb に追加
def action1
# ログインしていてもしていなくても見られるページ
end
def action2
if not logged_in?
# ログインしていないと、action1 に飛ばします。
redirect_to(:controller => '/account', :action => 'action1')
end
# ログインしていると見られます。
end
def action3
if logged_in?
# ログインしていると action2 に飛ばします。
redirect_to(:controller => '/account', :action => 'action2')
end
# ログインしいないと見られます。
end
もちろん、対応する rhtml を新規作成するのをお忘れなく!ちなみにお節介すぎるかもですが、ファイル名は以下のようになります。
app/views/account/action1.rhtml
app/views/account/action2.rhtml
app/views/account/action3.rhtml
次に、
2. コントローラごとに before_filter や skip_before_filter を使って指定する
別のやり方ですね。before_filter や skip_before_filter に、:login_required を指定して、コントローラ全体に、一気にログイン制限を掛けたり取っ払ったりできます。
例えば、app/controllers/honyarara_controller.rb があったとして、このコントローラのアクション全てで、ログインしているときだけページが見られるようにするには、
class HonyararaController < ApplicationController
before_filter :login_required
def action1
end
def action2
end
def action3
end
end
という 1 行を付け加えます。
さて、ここで、もしログインしていない状態で、この honyarara にアクセスしようとした場合(例:http://localhost:3000/honyarara/action1/) は、/account/login に飛ばされます。
というのは、lib/authenticated_system.rb ファイルの access_denied メソッドに書いてありますので、この飛び先を変えたい場合、そこを変更すれば大丈夫です。
でもって、before_filter や skip_before_filter の使用例を挙げておきますので、参考にしてください。
・このコントローラ全てのアクションでログインが必要
before_filter :login_required
・このコントローラの action1 と action2 アクションでのみログインが必要
before_filter :login_required, :only => [ :action1, :action2 ]
・このコントローラの action1 と action2 以外のアクションでログインが必要
before_filter :login_required, :except => [ :action1, :action2 ]
・このコントローラ全てのアクションでログインは必要ない
skip_before_filter :login_required
と、終了!次のエントリでは、まとめ、というかやったことの手順を書いてみて〆ることにします。
【広告】