• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    用rails中的before_action簡化身份驗證

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

    劉華煜

    摘要:網(wǎng)站的身份驗證代碼很多時候都是重復的,并且和功能代碼混雜在一起。用before_action則可以簡化代碼。

    關(guān)鍵詞:rails; before_action

    中圖分類號:TP391.1 文獻標識碼: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í)行前進行身份驗證,從而使活動的代碼不至于因為混入了身份驗證的代碼而顯得雜亂。

    1 網(wǎng)站身份驗證的一般流程

    一般的網(wǎng)站登錄后都要把用戶id作為session保存起來,以供以后身份驗證使用。

    在需要身份驗證的時候,以編輯文章為例,就把這個session拿出來,看看是不是文章作者本人或管理員,如果不是,則不允許編輯。

    身份驗證的一種特殊情況是管理員行為,管理員具有最高權(quán)限,如可以給文章置頂?shù)取?/p>

    2 相關(guān)代碼

    1) 登錄后將用戶id存儲在session中

    session['user']=id

    2) 在編輯文章的時候進行身份驗證

    def edit

    if session['user']!=author && session['user']!= 'admin'

    redirect_to '/login'

    end

    end

    如果身份不符,則重定向到登錄頁面。

    同樣,在刪除文章的時候也需要類似的代碼,這樣就出現(xiàn)了重復代碼,并且身份驗證代碼和完成編輯/刪除功能的代碼混雜在一起。

    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活動中就可以去除重復的身份驗證代碼,并且顯得很干凈。

    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í)行身份驗證,從而讓代碼變得更加簡潔。

    參考文獻:

    [1] Jeffrey Allan Hardy. Rails開發(fā)者指南[M]. 北京: 機械工業(yè)出版社, 2009.

    [2] Michael Hartl. Ruby on Rails教程[M]. 北京: 人民郵電出版社, 2017.

    和林格尔县| 虎林市| 广东省| 沙田区| 中江县| 井研县| 西林县| 聊城市| 电白县| 工布江达县| 崇礼县| 崇文区| 赤峰市| 扶余县| 阳泉市| 论坛| 铁岭市| 元氏县| 新和县| 广南县| 波密县| 晴隆县| 革吉县| 织金县| 嘉禾县| 宁波市| 巴林左旗| 彭山县| 新建县| 玉山县| 南汇区| 泽库县| 阿图什市| 沈丘县| 神池县| 新乡市| 武夷山市| 长沙市| 正安县| 山东省| 奉化市|