用rails中的before_action简化身份验证

2017-12-11 08:55刘华煜
电脑知识与技术 2017年31期

刘华煜

摘要:网站的身份验证代码很多时候都是重复的,并且和功能代码混杂在一起。用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.