【问题标题】:Rails, ActiveAdmin, Cancancan: how to prevent access to a resource in /admin?Rails、ActiveAdmin、Cancancan:如何防止访问/admin 中的资源?
【发布时间】:2021-08-04 14:56:32
【问题描述】:

我对 Rails (6.1.4) 很陌生。我尝试按照初学者的教程进行操作,效果很好。

然后我尝试稍微调整一下以适应我自己的目标,即简单地对“实验室”执行 CRUD 操作。效果也很好。

然后我想用这个“实验室”小应用程序尝试 ActiveAdmin 和 Devise 和 Cancancan。

看到它的安装和运行如此简单,我印象深刻。但后来我意识到每个用户,无论是什么角色(我有管理员角色、参考角色和咨询角色)都可以访问 /admin/laboratoires。

我希望只有具有管理员角色的用户才能访问 /admin/laboratoires。其他用户只能访问 /laboratoires。

我认为我可以通过这种方式简单地完成我的能力.rb 模型(我尝试了引用角色):

# frozen_string_literal: true
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    if user.admin_role?
      can :manage, :all 
   
    elsif user.referent_role?
      can [:read, :create, :update, :destroy], Laboratoire
      cannot [:read, :create, :update, :destroy], ActiveAdmin::Page, name: "Laboratoire", namespace_name: "admin" 
    
    elsif user.consultation_role?
      can [:read], Laboratoire
  
  end

end

但它似乎不起作用,我似乎不明白这里的东西。

有谁知道我写错了什么?也许我需要提供一些其他信息,但我不确定是否准确理解哪些是相关的,简单地说......

==== 更新 2021-08-05: 好吧,我实际上认为我刚刚找到了自己问题的答案。我想我对授权和身份验证感到困惑。我刚刚意识到 ActiveAdmin 的参数 config.authentication_method 可以帮助我处理这一点。所以我在应用控制器中写了一个方法,通过这个参数调用ActiveAdmin来防止非admin用户访问ActiveAdmin。它现在似乎工作得很好:)。

【问题讨论】:

    标签: ruby-on-rails activeadmin cancancan


    【解决方案1】:

    这里有完整的文档https://activeadmin.info/13-authorization-adapter.html 并确保您安装了cancancan gem,而不是cancan gem,它已被废弃

    所以您需要更新您的 ActiveAdmin 初始化程序,通常位于 config/initializers/active_admin.rb 并根据指南进行更新

    config.authorization_adapter = ActiveAdmin::CanCanAdapter
    config.on_unauthorized_access = :access_denied
    

    更新application_controller.rb文件

    class ApplicationController < ActionController::Base
      protect_from_forgery
    
      def access_denied(exception)
        redirect_to admin_organizations_path, alert: exception.message
      end
    end
    

    【讨论】:

    • 感谢您的回答。我实际上已经遵循了所有这些步骤,并在阅读您的信息后再次检查。在我的应用程序控制器以及所有配置中,一切似乎都很好,并且符合我从一开始就遵循的文档。
    • 你重启服务器了吗?
    • 解决了。我实际上对身份验证和授权感到困惑。在 Activeadmin 的配置中,我最终声明了一种身份验证方法,该方法是我在应用程序控制器中编写的,以防止在 Activezdmin 中允许非管理员用户。它运作良好。感谢您的帮助。
    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多