【发布时间】:2018-09-18 18:19:33
【问题描述】:
我正在使用 Devise 进行身份验证,并且我的 rails 应用程序中有“模块”。我正在尝试找出最佳的安全方法。例如,以下是我想要完成的几件事:
- 我希望应用程序控制器要求登录,除非他们正在访问
registrations控制器,在这种情况下他们只是提交注册详细信息。 - 在应用程序级别,我想定义范围,允许访问用户公司有权访问的某些控制器。
- 此外,对于每个请求,我想验证 URL 中的任何 ID(无论是 GET、POST 还是其他),用户的公司都可以访问该控制器和参数中的 ID。 (因此,如果他们的公司没有关联的报告 ID 9,他们就无法访问报告 ID 9)
我觉得这可能是可扩展的,但我以前从未这样做过,所以我不太确定。
子弹 1
在 ApplicationController 中,我想做这样的事情:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_user! unless controller == "Registrations"
end
我尝试在应用程序控制器中放置binding.pry,但controller_path 似乎总是application。不确定是否有一种简单的方法可以在不使用每个单独的控制器的情况下完成此操作,我希望避免这种情况,因为我不想在添加新控制器时意外忘记某些东西(基本上与 DRY 相悖)。
也许我可以实现一个安全控制器并让每个控制器都继承它?以前从未这样做过,但如果我无法在应用程序控制器中完成我想要做的事情,这可能会起作用。
子弹 2
我尝试从应用程序控制器访问 Devise 的 current_user 变量,但它不存在,所以我不确定是否可以从应用程序控制器检查用户的权限。同样,我希望避免在每个控制器中都放置此检查,因为随着应用程序的扩展,我最终可能会忘记实施检查。
编辑
所以看起来我已经解决了项目符号 1,但现在我正试图找出其他 2。能够在应用程序级别实现某种类型的“范围”或权限模块。有什么想法吗?
【问题讨论】:
-
before_action ... unless cond之类的代码存在很大问题。unless条件仅在控制器代码本身被加载时评估一次,而不是每次控制器运行时。你需要skip_before_action来处理这种事情。 -
知道了,所以在这种特殊情况下,听起来我只需要在每个新创建的控制器上手动实现
before_action :authenticate_user!?only选项似乎只适用于操作,我想限制所有控制器上的所有操作,除非它是注册控制器。
标签: ruby-on-rails devise