时间:2024-05-04
刘华煜
摘要:网站的身份验证代码很多时候都是重复的,并且和功能代码混杂在一起。用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.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!