使用单一模型错误设计和激活管理
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_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
或者,您可以只验证当前用户并按角色授权管理员视图。参见 Active Admin Authorization Adapter
我的应用程序需要为用户设计和活动管理员使用单一模型,我想根据配置文件模型中存在的角色区分超级管理员、管理员和用户,我遵循了 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_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
或者,您可以只验证当前用户并按角色授权管理员视图。参见 Active Admin Authorization Adapter