Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Pundit授权控制器_Ruby On Rails_Ruby On Rails 4_Pundit - Fatal编程技术网

Ruby on rails 使用Pundit授权控制器

Ruby on rails 使用Pundit授权控制器,ruby-on-rails,ruby-on-rails-4,pundit,Ruby On Rails,Ruby On Rails 4,Pundit,我正在学习使用权威进行授权。但在我看来,这是对资源的授权,而不是对页面的授权。我希望用户被重定向到一个未经授权的页面,如果他/她没有授权访问该页面使用权威 例如 class OnlyAdminCanVisitController < ApplicationController before_filter :admin_authenticate 仅类AdminCanvisitController

我正在学习使用权威进行授权。但在我看来,这是对资源的授权,而不是对页面的授权。我希望用户被重定向到一个未经授权的页面,如果他/她没有授权访问该页面使用权威

例如

class OnlyAdminCanVisitController < ApplicationController
    before_filter :admin_authenticate
仅类AdminCanvisitController
停止非管理员角色用户

此外,我还想处理以下虚构场景(考虑到有4个角色,分别是管理员、经理、员工和局外人。下面的设计显然很糟糕)

class AdminManagerCanVisitController
我有4个角色,希望为这些控制器编写权威政策,允许任何授权组合

让我知道,如果专家是为了解决这个问题


谢谢

实际上,页面和资源之间没有太大区别。因此,您可以通过从
应用程序\u controller.rb营救被拒绝的授权来解决问题:

class ApplicationController < ActionController::Base
  include Pundit

  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  protected

  def admin_authenticate
    authorize current_user, :admin?
  end

  private

  def user_not_authorized(exception)
    # Redirect to whatever page you want if not authorized
  end
end
然后在其他控制器中,只需执行以下操作:

class OnlyAdminCanVisitController < ApplicationController
  before_action :admin_authenticate
end
仅类AdminCanvisitController
实际上,页面和资源之间没有太大区别。因此,您可以通过从
应用程序\u controller.rb营救被拒绝的授权来解决问题:

class ApplicationController < ActionController::Base
  include Pundit

  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  protected

  def admin_authenticate
    authorize current_user, :admin?
  end

  private

  def user_not_authorized(exception)
    # Redirect to whatever page you want if not authorized
  end
end
然后在其他控制器中,只需执行以下操作:

class OnlyAdminCanVisitController < ApplicationController
  before_action :admin_authenticate
end
仅类AdminCanvisitController
谢谢..它解决了我一半的问题。另一半是如果我在那里有4个角色4!授权组合例如,4个组合中有2个是合格的,或者4个组合中有3个是合格的,我不能为这些组合中的每一个都使用身份验证功能…如果我遗漏了什么,请告诉我..好的。你能用你的角色代码更新你的帖子吗?这样问题就更清楚了。这将取决于您如何设计用户/角色组合。策略规则适用于用户对象。您是如何在模型/数据库级别设计角色的?角色是一个表,通过用户角色表与用户有多对多关系。这很简单。在您的策略文件(
UserPolicy
ApplicationPolicy
)中,create有许多您需要的规则(如
admin?
)。为了在控制器内保持干燥,您可以使用
关注点
或包装一个实用函数来处理要检查的角色。我的例子是基于一个角色,但同样可以应用于许多角色。谢谢。它解决了我一半的问题。另一半是如果我在那里有4个角色4!授权组合例如,4个组合中有2个是合格的,或者4个组合中有3个是合格的,我不能为这些组合中的每一个都使用身份验证功能…如果我遗漏了什么,请告诉我..好的。你能用你的角色代码更新你的帖子吗?这样问题就更清楚了。这将取决于您如何设计用户/角色组合。策略规则适用于用户对象。您是如何在模型/数据库级别设计角色的?角色是一个表,通过用户角色表与用户有多对多关系。这很简单。在您的策略文件(
UserPolicy
ApplicationPolicy
)中,create有许多您需要的规则(如
admin?
)。为了在控制器内保持干燥,您可以使用
关注点
或包装一个实用函数来处理要检查的角色。我的示例基于一个角色,但同样的情况也可以应用于多个角色。