我已将所有用户身份验证代码放在一个位置,即 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
我将此模块作为应用程序助手的一部分包含在内,因此这些功能在所有视图中都可用:
application_helper.rb
require 'auth'
module ApplicationHelper
include Admin
# other stuff here
end
而且我还将它作为应用程序控制器的一部分包含在内,因此控制器同样可以调用函数:
应用程序.rb
require 'auth'
class ApplicationController < ActionController::Base
include Admin
end
到现在为止还挺好。
问题是我的应用程序不像普通的网络应用程序。具体来说,多个用户可以同时从同一台计算机登录系统(使用相同的浏览器)。我通过查看从该 IP 登录的所有人员来对操作进行身份验证,如果他们都能做到,则通过。
这意味着,如果管理员想要做某事,该管理员必须先将其他所有人注销,这很烦人。但是我们希望管理员所做的一切都得到管理员的批准。所以给我的建议是拥有它,以便管理员可以在他们通常无法访问的任何页面上提供用户名/密码组合(例如,“编辑用户”页面将具有这些额外的输入字段)并且身份验证例程将检查那个。这表示
Admin::do_i_have_permission_to?(permission)
需要获取当前请求参数。我不能像在控制器中那样只使用 params[:foo],因为 params 没有定义;同样 request.parameters[:foo] 也不起作用。我的搜索显示:
- 当前搜索参数在当前请求中,
- 当前请求在当前控制器中,
- 当前控制器在当前调度器中,并且
- 我不确定当前的调度程序是否保存在任何地方。
也就是说,经验告诉我,当我跳过这么多圈时,我很可能做错了。那么正确的方法是什么?我考虑过的选项是:
- 只需将当前在 auth.rb 中的所有功能移动到 ApplicationHelper 中(我认为)他们将可以访问请求等。有效,但把帮手弄得一团糟。
- 将所有功能移到其他地方,他们会看到这些方法(我不知道在哪里)
- 我只是缺少一些东西。