获得当前的请求在轨道从一个文件在lib/
-
05-07-2019 - |
题
我已经把我所有的用户认证码在一个地方,即lib/认证。rb。它看起来像这样:
lib/认证。rb
module Admin
def do_i_have_permission_to?(permission)
# Code to check all of this goes here
end
end
包括我这个模块的一部分作为辅助应用程序,所以这些功能都可以在所有意见:
application_helper.rb
require 'auth'
module ApplicationHelper
include Admin
# other stuff here
end
和我,还包括它作为部分应用程序的控制,所以控制同样可以叫功能:
应用程序。rb
require 'auth'
class ApplicationController < ActionController::Base
include Admin
end
到目前为止,一切都很好.
问题是,我的应用程序是不像一个正常的网络应用程序。具体地说,多个用户可以登录到系统中来自相同的计算机在同一时间(使用同一浏览器)。我不认证采取行动,通过寻找,在所有的人都登录在从知识产权,如果他们都可以做到这一点,它通过。
这意味着,如果管理员要做的事情,那管理员已登录其他人了第一,这是令人讨厌。但是,我们希望管理密封的批准的一切管理。所以建议给我的是它使管理员可以提供一个用户名和密码组合的任何网页上,他们通常不会有访问的(例如一个编辑用户的网页将这些额外的输入输领域)以及身份验证程序,将检查。这意味着
Admin::do_i_have_permission_to?(permission)
需要得到在当前的请求的参数。我不能只用params[:foo]像我会在一个控制器,因为params不是定义;同样请求。参[:foo]也将无法工作。我的搜寻有透露:
- 目前搜索参数,在当前的请求,
- 目前的请求在目前的控制器,
- 目前的控制器是在目前的调度员,
- 我不确定当前的调度程序保持在任何地方。
这就是说,经验告诉我,当我跳过这个多的篮球,我很可能这样做是错误的。那么,什么是正确的方式做到这一点?选项我认为是:
- 只有将所有的职能目前正在认证。rb入ApplicationHelper在哪(我认为),他们将有权访问请求等。工作原理,但扰乱了地狱的帮手。
- 移动的所有功能在其他地方,他们会看到这些方法(我不知道在哪里)
- 我只是简单缺少的东西。
解决方案
在一个典型的轨道应用程序,认证信息存储的积极届会议上,不参数。因此,它相当直接的,以编写一个帮助不会你想要什么。
它似乎相当非正统的创建一个模块,然后被包括在ApplicationHelper.传统的做法是创建一个独立的辅助,在这种情况下可能会被称为AuthenticationHelper.这可以被包括在任何必要控制器,或者如果你喜欢,载入ApplicationController使用普遍。
一般而言,助手应该不包括其他的助手。最好是简单地加载多个帮手到一定的控制器。
辅助方法具有全面接到任何实例声明的变量在内的控制器方面它们的工作。具体来说,这些实例变量只(@名称)并没地方变量(名称)。辅助方法是执行一个特定的观点。
另外,我不知道为什么一个用户,将提供凭证,并执行一个运作中的相同步骤,至少是对传统的基于网络的应用程序。通常的过程和随后执行行动分开。
然而,在这种情况下的一个API其中每个交易是一个独立操作,最直接的方法是要做的就是拉出的相关请求的参数,这些参数处理与身份验证,建立一些控制变量,然后继续执行的具体请求给予的约束,该凭证强加。
该方法通常我会跟这种事情是要层在一个身份验证的结构在ApplicationController本身可以执行必需的检查。这些都是受保护的方法。
虽然人们很容易卷在一堆的他们如can_edit_user?和can_create_group?这些非常迅速地变得不可收拾。这是一个更简单的设计放在一个钩,用于一般目的can_perform?或has_authority_to?方法就是通过了操作和任何必需的参数。
例如,一个非常粗略的执行情况:
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
显然你想要滚了很多的权力机构检查进入before_filter块,以避免重复和促进一致性。
一个完整的框架的例子可能是更多的帮助,例如腕带用户认证系统: