我已经阅读了这篇文章https://nvisium.com/blog/2014/09/10/understanding-protectfromforgery/,如果我理解正确的话,默认情况下在Rails 3中如果我们有一个看起来像这样的控制器:
class ApplicationController < ActionController:Base
protect_from_forgery
end
最终会发生什么(如果是攻击者),会话将被销毁。这意味着如果我们做的事情就是检查用户是否经过身份验证,因为没有会话,它将停止请求。
所以,我的问题是,我相信这一点:
class ApplicationController < ActionController:Base
protect_from_forgery
before_action :authenticate_user
private
def authenticate_user
raise NotAuthenticated unless session.key?(:user)
end
end
是否正确的方式,而不是
class ApplicationController < ActionController:Base
before_action :authenticate_user
protect_from_forgery
private
def authenticate_user
raise NotAuthenticated unless session.key?(:user)
end
end
或者换句话说,protect_from_forgery应该是我们在控制器中做的第一件事。
我的假设是否正确,或者我错过了关于操作顺序如何在控制器中工作的内容?
答案 0 :(得分:3)
这两种方法的顺序并不重要,没有。
当执行这些方法时,原因与有关:那些是类级别的方法,当Ruby加载文件时,这些方法在类本身的上下文中执行。
查看protect_from_forgery
的来源:
def protect_from_forgery(options = {})
options = options.reverse_merge(prepend: false)
self.forgery_protection_strategy = protection_method_class(options[:with] || :null_session)
self.request_forgery_protection_token ||= :authenticity_token
before_action :verify_authenticity_token, options
append_after_action :verify_same_origin_request
end
这些基本上是在调用类时将代码添加到类中的宏,这是一种元编程形式。你可以用手动设置这些东西替换类中的方法调用,它也是一样的。
这一切都发生在您的代码首次加载之前,在应用程序启动之前。