国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

用rails中的before_action簡化身份驗證

2017-12-11 08:55劉華煜
電腦知識與技術(shù) 2017年31期

劉華煜

摘要:網(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.

北宁市| 武鸣县| 汕尾市| 息烽县| 肥东县| 博客| 武隆县| 广饶县| 尼木县| 余江县| 古交市| 交城县| 响水县| 永康市| 龙岩市| 来凤县| 清丰县| 吴江市| 深州市| 白沙| 岳池县| 枝江市| 扬州市| 金溪县| 湟源县| 达州市| 瑞金市| 刚察县| 桂平市| 曲沃县| 乐昌市| 长春市| 红原县| 永善县| 新晃| 兰西县| 炎陵县| 西昌市| 宣威市| 蓬溪县| 玉林市|