劉華煜
摘要:網(wǎng)站的身份驗證代碼很多時候都是重復(fù)的,并且和功能代碼混雜在一起。用before_action則可以簡化代碼。
關(guān)鍵詞:rails; before_action
中圖分類號:TP391.1 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)31-0017-01
Simplify Authentication with before_action in Rails
LIU Hua-yu
(College of Mathematics Science,Luoyang Normal University, Luoyang 471934, China)
Abstract: Authentication code of web site is often repeated, and is mixed with the function code. Using before_action can simplify code.
Key words: rails; before_action
絕大多數(shù)網(wǎng)站都需要身份驗證,以防無意或惡意的破壞。很多網(wǎng)頁都會用到身份驗證的代碼,而這些代碼絕大多數(shù)情況下極其相似或甚至就是一樣。
Rails提供了before_action方法,可以在活動執(zhí)行前執(zhí)行指定代碼。這樣就可以在活動執(zhí)行前進(jìn)行身份驗證,從而使活動的代碼不至于因為混入了身份驗證的代碼而顯得雜亂。
1 網(wǎng)站身份驗證的一般流程
一般的網(wǎng)站登錄后都要把用戶id作為session保存起來,以供以后身份驗證使用。
在需要身份驗證的時候,以編輯文章為例,就把這個session拿出來,看看是不是文章作者本人或管理員,如果不是,則不允許編輯。
身份驗證的一種特殊情況是管理員行為,管理員具有最高權(quán)限,如可以給文章置頂?shù)取?/p>
2 相關(guān)代碼
1) 登錄后將用戶id存儲在session中
session['user']=id
2) 在編輯文章的時候進(jìn)行身份驗證
def edit
if session['user']!=author && session['user']!= 'admin'
redirect_to '/login'
end
…
end
如果身份不符,則重定向到登錄頁面。
同樣,在刪除文章的時候也需要類似的代碼,這樣就出現(xiàn)了重復(fù)代碼,并且身份驗證代碼和完成編輯/刪除功能的代碼混雜在一起。
3 用before_action重構(gòu)代碼
1) 先寫一個通用方法用于驗證身份
def check_user
if session['user']!=author && session['user']!= 'admin'
redirect_to '/login'
end
end
2) 在控制器最開始部分使用before_action
before_action :check_user, :only => [:edit,:destroy]
意思是在執(zhí)行edit和destroy活動前執(zhí)行check_user方法。
這樣的話edit和destroy活動中就可以去除重復(fù)的身份驗證代碼,并且顯得很干凈。
4 驗證管理員
驗證是否是管理員的方法如下:
def check_admin
if session['user']!= 'admin'
redirect_to '/login'
end
end
此時我們發(fā)現(xiàn)這個方法和check_user很像,所以二者可以合并:
def check_user(u)
unless u.include? session['user']
redirect_to '/login'end
end
驗證是否是管理員用check_user(['admin']),驗證是否是作者或管理員用check_user(['admin',author])。
由于before_action :check_user, :only => [:edit,:destroy]只能指定方法名,無法指定參數(shù),所以此時應(yīng)該用before_action的塊參數(shù)方式:
before_action :only => [:edit,:destroy] do
check_user(['admin',author])
end
意思是編輯和刪除需要驗證是否是作者或管理員
而置頂/取消置頂?shù)葎t只需驗證是否是管理員:
before_action :only => [:toup,:untoup] do
check_user(['admin'])
end
5 結(jié)束語
靈活的應(yīng)用before_action,可以在執(zhí)行活動前執(zhí)行身份驗證,從而讓代碼變得更加簡潔。
參考文獻(xiàn):
[1] Jeffrey Allan Hardy. Rails開發(fā)者指南[M]. 北京: 機(jī)械工業(yè)出版社, 2009.
[2] Michael Hartl. Ruby on Rails教程[M]. 北京: 人民郵電出版社, 2017.