网站首页  词典首页

请输入您要查询的论文:

 

标题 用rails中的before_action简化身份验证
范文

    刘华煜

    摘要:网站的身份验证代码很多时候都是重复的,并且和功能代码混杂在一起。用before_action则可以简化代码。

    关键词: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

    绝大多数网站都需要身份验证,以防无意或恶意的破坏。很多网页都会用到身份验证的代码,而这些代码绝大多数情况下极其相似或甚至就是一樣。

    Rails提供了before_action方法,可以在活动执行前执行指定代码。这样就可以在活动执行前进行身份验证,从而使活动的代码不至于因为混入了身份验证的代码而显得杂乱。

    1 网站身份验证的一般流程

    一般的网站登录后都要把用户id作为session保存起来,以供以后身份验证使用。

    在需要身份验证的时候,以编辑文章为例,就把这个session拿出来,看看是不是文章作者本人或管理员,如果不是,则不允许编辑。

    身份验证的一种特殊情况是管理员行为,管理员具有最高权限,如可以给文章置顶等。

    2 相关代码

    1) 登录后将用户id存储在session中

    session['user']=id

    2) 在编辑文章的时候进行身份验证

    def edit

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

    redirect_to '/login'

    end

    …

    end

    如果身份不符,则重定向到登录页面。

    同样,在删除文章的时候也需要类似的代码,这样就出现了重复代码,并且身份验证代码和完成编辑/删除功能的代码混杂在一起。

    3 用before_action重构代码

    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]

    意思是在执行edit和destroy活动前执行check_user方法。

    这样的话edit和destroy活动中就可以去除重复的身份验证代码,并且显得很干净。

    4 验证管理员

    验证是否是管理员的方法如下:

    def check_admin

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

    redirect_to '/login'

    end

    end

    此时我们发现这个方法和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]只能指定方法名,无法指定参数,所以此时应该用before_action的块参数方式:

    before_action :only => [:edit,:destroy] do

    check_user(['admin',author])

    end

    意思是编辑和删除需要验证是否是作者或管理员

    而置顶/取消置顶等则只需验证是否是管理员:

    before_action :only => [:toup,:untoup] do

    check_user(['admin'])

    end

    5 结束语

    灵活的应用before_action,可以在执行活动前执行身份验证,从而让代码变得更加简洁。

    参考文献:

    [1] Jeffrey Allan Hardy. Rails开发者指南[M]. 北京: 机械工业出版社, 2009.

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

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/16 17:59:19