【问题标题】:Authorization with Devise and multiple levels具有设计和多个级别的授权
【发布时间】:2015-02-11 01:08:37
【问题描述】:

我需要一些有关授权的帮助。到目前为止,我正试图通过内部 rails 授权与设计相结合来解决它。 我有一个用户正在发布请求。如果此请求是私人的,则只有一组“读者”可以看到并回答该请求。 (这是第一名)

然后用户给读者的答案打分。这应该只有收到答案的用户和给出答案的“读者”才能访问。

到目前为止,我使用以下方法来限制对隐藏请求的访问:

 before_filter :require_reader!, only: [:open_requests]

但是如果请求没有被隐藏,那么仍然只有读者应该能够回答请求(但所有人都可以看到它)。在这里我不知道如何管理这个。有什么想法吗?

要继续...我无法解决第二个问题(评级只能看到提出请求的人和读者)。 这里有什么想法吗?

cancancan 是一种选择吗?

最好的 维塔利

【问题讨论】:

  • 你用什么来定义“读者”这个组? Devise 用于对用户进行身份验证,以便您知道他们是谁,但需要使用您自己的一些逻辑或其他库来管理组成员资格和权限。
  • Cancancan 或 xacml 是要走的路
  • @LisaD:我正在使用 www.railsbricks.net 生成器(真的很酷!),它带有管理功能。我将此应用于“阅读器”。但是问题是我如何限制功能(发布和查看)。每个人都可以看到它,但只有“读者”可以发布答案.. DavidBrossard:谢谢,我会检查 xacml。

标签: devise authorization ruby-on-rails-4.2


【解决方案1】:

您所做的并不完全遵循 Railsbricks 等工具通常设置的“管理员”模式。 “管理员”权限模式通常是一整套仅供管理员使用的操作/视图,因此通常整个控制器或控制器系列都具有 :require_admin!在每个操作和视图之前应用过滤器。非常简单的权限逻辑,它只依赖于用户和视图。

相反,您所拥有的是具有取决于对象状态以及用户状态和视图的权限的视图。因此,您将不得不编写自己的过滤器来使用,而不是使用“require_reader!”。

例如,您可能有一个 RequestsController,您可以向其中添加:

  before_action :must_be_able_to_view_request, except: [:index, :new, :create]

然后在控制器中定义那个过滤器:

  private
  def must_be_able_to_view_request
    if !current_user.is_reader? && !@request.ispublic
       head :forbidden
    end
  end

如果您需要在其他控制器中使用相同的过滤器,那么您可以在您的 ApplicationController 中定义它。

【讨论】:

  • 你对整个控制器是正确的。这是一个很好的观点。我将尝试您的过滤器选项,并在我有一些结果时通知您。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2020-03-20
相关资源
最近更新 更多