我的应用程序需要为用户的Devise和Active Admin提供一个单一的模型,我想根据Profile模型中的角色来区分超级管理员、管理员和用户,我通过dan doezema点击了这个链接。请帮帮我,因为我是铁路界的新手,不知道在这个问题上该怎么办。我已经删除了默认创建的管理员用户。我在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设置。请参阅活动管理员身份验证
具体来说,您需要设置:config.authentication_method
和config.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
或者,您可以只验证当前用户并按角色授权管理员视图。请参阅活动管理员授权适配器