9/13/2006

RoR Access Control : before_filter

基本上,RoR要做到 Access Control 的部份
使用 before_filter 是最簡單的方式

before_filter 就是當你進入這個 controller
他會先經過這個 filter
然後才會執行相關的 action
所以我們可以在 before_filter 裡面
加入 session 裡面是不是有 user 資料
如果沒有,導入到 login 頁面
如果有,就直接自動執行

範例,一個 Controller 名字叫做 Apple ,他裡面要做 access control
class AppleController < ActionController::Base
before_filter :authorize

def authorize
redirect_to :controller => 'login' , :action => 'index' unless session[:user]
end
end

但是問題來了
今天一堆 controller
如果每個都得加上 before_filter
那不是加到累死了
而且嚴重違反 DRY 準則

所以我們想到了
所有controller 都繼承 ApplicationController
那我們加到 ApplicationController 裡面就好了
class ApplicationController < ActionController::Base
before_filter :authorize

def authorize
redirect_to :controller => 'login' , :action => 'index' unless session[:user]
end
end
呵呵,這樣就萬事大成了嗎?
怎麼瀏覽器不動了?
看看 log ,發現到 before_filter 的確 work
但是就連我們的登入頁面 LoginController 裡面的 index action 進入 before filter
所以呈現一個無窮迴圈

要怎麼做呢?
其實我們只要每個 controller 都有 before filter
但是 login controller 不需要 before filter 即可
class LoginController < ActionController::Base
skip_before_filter :authorize

.....
.....
.....
end
我們在 LoginController 裡面使用 skil_before_filter 將 before_filter skip 掉
大功告成!!!

沒有留言: