使用单一模型错误设计和激活管理

Devise and Active Admin using a single model error

我的应用程序需要为用户设计和活动管理员使用单一模型,我想根据配置文件模型中存在的角色区分超级管理员、管理员和用户,我遵循了 this link by dan doezema.请帮助我,因为我是 rails 世界的新手,不知道如何解决这个问题。 我删除了默认创建的管理员用户。我在 app/admin 文件夹中的 user.rb 文件是:

    ActiveAdmin.register User do
        form do |f|
            f.inputs "User Details" do
                f.input :email
            end
            f.buttons
        end
    end

这里我使用了User,因为我想使用设计生成的User。我在 app/admin 中的 users.rb 文件是:

    ActiveAdmin.register User do
        permit_params :email
        index do
            selectable_column
            id_column
            column :email
            column :current_sign_in_at
            column :sign_in_count
            column :created_at
            actions
        end
        filter :email
        filter :current_sign_in_at
        filter :sign_in_count
        filter :created_at
        form do |f|
            f.inputs do
                f.input :email
                end
                f.actions
            end
        end

我没有更改 app/admin 中的 dashboard.rb 文件。 application_controller.rb 文件是:

    class ApplicationController < ActionController::Base
        protect_from_forgery with: :exception
        def authenticate_admin_user!
            authenticate_user!
            unless current_user.profile.role == 'super_admin'
                flash[:alert] = "Unauthorized Access!"
                redirect_to root_path
            end
        end
    end

我已经从 routes.rb 文件中删除了以下路由

    devise_for :admin_users, ActiveAdmin::Devise.config

我也破坏了 AdminUser 模型

您可以在 config/initializers/active_admin.rb 中配置 Active Admin 设置。参见 Active Admin Authentication

具体来说,您需要设置:config.authentication_methodconfig.current_user_method 以匹配您在 ApplicationController.

中定义的方法

示例:

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  protected

  def authenticate_admin_user!
    authenticate_user!
    unless current_user.profile.role == 'super_admin'
      flash[:alert] = "Unauthorized Access!"
      redirect_to root_path
    end
  end

  def current_admin_user
    return unless current_user&.profile.role == 'super_admin'
    current_user
  end
end

config/initializers/active_admin.rb

config.authentication_method = :authenticate_admin_user!
config.current_user_method = :current_admin_user

或者,您可以只验证当前用户并按角色授权管理员视图。参见 Active Admin Authorization Adapter