MAY.
4
这篇博客来分享下,最近一次我对自己网站的小重构。
Rails里推荐的一种验证方式,是在ApplicationController 中创建一个authorized?方法,并声明它为before_filter。这样在所有的Controller 中,就可以利用它来进行权限的验证,如果验证不成功,就重定向到首页或报错,这很好的实现了程序的分层和隔离。但有些Controller中既包含一些让所有人访问的action,也包含一些需要验证的action。
拿我的BlogController 举例来说明:不需要验证的actions 有index, show 和rss;需要验证的有new, create, edit, update 和destroy。那么就有两种方式来区分这些actions。一种是:
skip_before_filter :authorize, :except => [:new, :create, :edit, :update, :destroy]
另一种是:
skip_before_filter :authorize, :only => [:index, :show, :rss]
两种的结果是一模一样的,但我偏向于后者。理由如下:
- 如果你增加一个新的不需要验证的action,譬如comment,对于第一种,你的确省了点事,skip_before_filter那一行不用修改任何代码,你新加的测试也都不会有一点问题;但要是你新加一个需要验证的action,譬如soft_delete,你的测试也没考虑到是否要验证,同时你也忘记了在Controller 中except 它,那么测试全过,但安全性却无法保障,知道这个接口的任何人都可以软删除你的任何博文。但是对于第二种,如果你忘记登入,那么测试会失败,因为会重定向到首页或报错,这就告诉你这个action 的正确行为。
- 这个理由可能有点牵强,我觉得第二种方式对于中国人的思考方式更好阅读,可能中国人对于unless和except 这种方式不太习惯吧,至少我是这样的。我们习惯于说话正着说,不喜欢把东西放在最后,还要转折那么一下。
好了,今天就是这么一点小小的思考。
1 comments.
post a comment 我要评论
name: 白名单比黑名单安全。
