Ruby on rails 在开发模式中绕过身份验证和/或授权的好方法是什么?

Ruby on rails 在开发模式中绕过身份验证和/或授权的好方法是什么?,ruby-on-rails,ruby,authentication,authorization,Ruby On Rails,Ruby,Authentication,Authorization,我有几个操作受到过滤器的保护,这些过滤器检查登录?和管理?并在测试失败时分别抛出401或403个错误。只有在开发模式下才能绕过这些过滤器,这样我才能测试我的应用程序,有什么好方法 我无法完成实际的登录过程,因为它依赖于我在开发过程中无法访问的基础设施 我还希望能够检查401和403是否正确,所以我不想完全关闭所有的身份验证过滤器。我希望在尽可能少的地方定义它,这样我就不会在生产中意外地让世界绕过过滤器 有人找到了一个好的覆盖机制吗?我想到了一些想法: 分别在过滤器中添加对params[:log

我有几个操作受到过滤器的保护,这些过滤器检查
登录?
管理?
并在测试失败时分别抛出401或403个错误。只有在开发模式下才能绕过这些过滤器,这样我才能测试我的应用程序,有什么好方法

我无法完成实际的登录过程,因为它依赖于我在开发过程中无法访问的基础设施

我还希望能够检查401和403是否正确,所以我不想完全关闭所有的身份验证过滤器。我希望在尽可能少的地方定义它,这样我就不会在生产中意外地让世界绕过过滤器

有人找到了一个好的覆盖机制吗?我想到了一些想法:

  • 分别在过滤器中添加对
    params[:logged_in]&&RAILS\u ENV=~/dev/
    params[:admin]&&RAILS\u ENV=~/dev/
    的检查。这适用于
    GET
    s,但我必须在所有表单和AJAX请求中添加额外的隐藏字段
  • 添加一个仅在开发模式下可用的链接,该链接模拟以普通用户或管理员身份登录。这似乎是一个更好的选择

在开发时,向模拟真实身份验证框架的环境中添加脚本,或重新定义基本功能(如“is#logged_in”方法)以始终返回true,这样,您只需更改不同环境之间的部分。

您可以为auth函数添加一些代码,这些函数在开发过程中返回true

   def logged_in?
     return true if Rails.env.development?
     ... etc
   end

当你这样做的时候,你需要两件事:

  • 在开发过程中传递身份验证信息的替代方法,以及
  • 确保在生产中关闭此功能的方法
  • 第二,我通常在配置文件中使用默认为“off”的某种开关,但您也可以只检查是否存在具有特殊名称的文件,或任何适合您的文件。为了确保不会在生产中启用此功能,您还可以添加进一步的检查,例如在服务器以特定用户身份运行时拒绝启用它(如果您有运行生产系统的特定用户名),或者在请求不是来自本地主机地址时拒绝使用它

    至于你做什么,你有很多选择。您可以从开发人员根据自己的喜好编辑的文件中读取信息(YAML是一种很好的格式,文件本身的存在可以作为开启此功能的开关。如果您确实需要从本地主机以外的主机进行测试,您还可以在该文件中包含授权IP地址)。如果您有一个浏览器插件,比如WebDeveloperforFirefox,那么设置标题就很容易了,而且对于通过HTTP进行功能测试也非常方便。在URL中添加额外的参数是很流行的,但我自己并不觉得这样方便


    一旦您获得了验证信息,那么您所需要做的就是选择适当的点,在该点插入模拟对象,而不是在开发中无法使用的与验证系统通信的真实对象。如果您现在没有这样的位置,则必须重构代码来创建它。

    在config/environments中,您为每个环境都提供了脚本,允许您应用特定于环境的设置


    如果这些设置在Rails引导过程中应用得足够晚,那么我会考虑在那里覆盖您的身份验证机制的相关方面。这避免了在生产应用程序中使用特定于开发的代码,这对我来说是个好主意

    是的,但是我不能在开发过程中测试真正的功能。这就是我在第一个要点中提出的建议。Mislav Marohnić在这方面有一个巧妙的转变:通过这种方式,您可以自动登录,但前提是您获得登录表单(比如,/login.html)。