代码之家  ›  专栏  ›  技术社区  ›  Atiaxi

从库中的文件获取rails中的当前请求/

  •  1
  • Atiaxi  · 技术社区  · 17 年前

    我把所有的用户身份验证代码放在一个地方,即lib/auth.rb。它看起来像这样:

    lib/auth.rb

    module Admin
    
      def do_i_have_permission_to?(permission)
        # Code to check all of this goes here
      end
    
    end
    

    require 'auth'
    module ApplicationHelper
      include Admin
      # other stuff here
    end
    

    我还将其作为应用程序控制器的一部分,因此控制器同样可以调用以下函数:

    application.rb

    require 'auth'
    class ApplicationController < ActionController::Base
      include Admin
    end
    

    到目前为止,一切顺利。

    这意味着,如果管理员想做某事,该管理员必须先将其他人注销,这很烦人。但我们希望管理员所做的一切都有管理员的批准印章。所以给我的建议是,这样管理员就可以在他们通常无法访问的任何页面上提供用户名/密码组合(例如,“编辑用户”页面将有这些额外的输入字段),身份验证例程将对此进行检查。这意味着

    Admin::do_i_have_permission_to?(permission)
    

    需要获取当前的请求参数。我不能像在控制器中那样只使用params[:foo],因为params没有定义;类似的request.parameters[:foo]也不会工作。我的搜索显示:

    • 当前请求在当前控制器中,
    • 我不确定现任调度员是否在任何地方。

    • 只需将auth.rb中当前的所有函数移动到ApplicationHelper中(我认为),它们就可以访问请求等。有效,但会把帮手弄得一团糟。
    • 将所有函数移动到其他地方,他们会看到这些方法(我不知道在哪里)
    • 我只是缺少了一些东西。
    1 回复  |  直到 17 年前
        1
  •  4
  •   tadman    17 年前

    在典型的Rails应用程序中,身份验证信息存储在活动会话中,而不是参数中。因此,编写一个能做你想做的事情的助手是相当简单的。

    创建一个模块并将其包含在ApplicationHelper中似乎相当不正统。传统的方法是创建一个单独的助手,在这种情况下,它可能被称为AuthenticationHelper。然后,这可以包含在任何所需的控制器中,或者如果您愿意,可以加载到ApplicationController中,使其普遍可用。

    一般来说,助手不应包括其他助手。最好将多个助手加载到给定的控制器中。

    助手方法可以完全访问它们所操作的控制器上下文中声明的任何实例变量。具体来说,这些只是实例变量(@name),而不是局部变量(name)。也为特定视图执行辅助方法。

    此外,我不确定为什么用户会在同一步骤中提供凭据并执行操作,至少对于传统的基于网络的应用程序是这样。通常,该过程是登录,然后单独执行操作。

    然而,在API的情况下,每个事务都是一个独立的操作,最直接的方法是提取处理身份验证的相关请求参数,建立一些控制器实例变量,然后在证书施加的限制下继续执行特定请求。

    对于这类事情,我通常采用的方法是在ApplicationController本身中加入一个身份验证结构,该结构可以执行所需的检查。这些是受保护的方法。

    虽然像can_edit_user这样的用户很容易加入其中?还有can_create_group?这些很快就会失控。为通用can_performe设置挂钩是一种更简单的设计?还是有权限?传递操作和任何所需参数的方法。

      class ApplicationController < ActionController::Base
      protected
        def has_authority_to?(operation, conditions = { })
          AuthenticationCheck.send(operation, conditions)
        rescue
          false
        end
      end
    
      module AuthenticationCheck
        def self.edit_user?(conditions)
          session_user == conditions[:user]
        end
      end
    
      class UserController
        # ...
    
        def edit
          @user = User.find(params[:id])
    
          unless (has_authority_to?(:edit_user, :user => @user))
            render(:partial => 'common/access_denied', :status => :forbidden)
          end
        rescue ActiveRecord::RecordNotFound
          render(:partial => 'users/not_found')
        end
      end
    

    http://github.com/theworkinggroup/wristband/tree/master