我的active_admin上有以下内容,这只是admin_user模型的默认值。这允许所有admin_users更改所有其他admin_users的密码。有人知道如何限制admin_users更改其他人的密码吗?
ActiveAdmin.register AdminUser do
index do
column :email
column :current_sign_in_at
column :last_sign_in_at
column :sign_in_count
default_actions
end
filter :email
form do |f|
f.inputs "Admin Details" do
f.input :email
f.input :password
f.input :password_confirmation
end
f.actions
end
end
答案 0 :(得分:0)
我不确定。但你可以尝试一下,
ActiveAdmin.register AdminUser do
actions :all, :except => [:new]
controller do
def action_methods
if current_admin_user.role?(AdminUser::ADMIN_ROLE)
super
else
super - ['edit', 'destroy']
end
end
end
end
答案 1 :(得分:0)
另一种方法可能是从此表单中删除password和password_confirmation字段并创建“更改密码”操作,甚至可以在“我的帐户”页面中更改密码。
第三种方式可能只是在您自己编辑时显示密码字段,如下所示:
ActiveAdmin.register AdminUser do
index do
column :email
column :current_sign_in_at
column :last_sign_in_at
column :sign_in_count
default_actions
end
filter :email
form do |f|
f.inputs "Admin Details" do
f.input :email
if(f.object == current_admin_user)
f.input :password
f.input :password_confirmation
end
end
f.actions
end
end
未经测试,但它应该有效。
<强>更新强> 如果您希望某个特定用户能够像您在问题评论中所建议的那样更新所有其他用户的密码,则可以考虑以下事项:
form do |f|
f.inputs "Admin Details" do
f.input :email
if(current_admin_user.is_super_admin?)
f.input :password
f.input :password_confirmation
end
end
f.actions
end
is_super_admin?
可以引用布尔值is_super_admin
,也可以是模型中的方法,具体取决于role
字段:
# role :string(255)
class AdminUser < ActiveRecord::Base
ROLES = ['normal', 'super']
SUPER_ROLE = 'super'
def is_super_admin?
role == SUPER_ROLE
end
end
更新2 您确实还希望阻止用户更改post参数以更改其他人的密码。再次,选项1 ,在控制器中执行此操作。我对ActiveAdmin只有很浅的了解,所以也许有更好的方法,但这应该有效:
ActiveAdmin.register AdminUser do
controller do
def create
params.delete(:password)
params.delete(:password_confirmation)
super
end
end
end
另一个(更优雅)解决方案是确保您的AdminUsers密码无法通过批量分配进行更改。这种逻辑将进入模型:
class AdminUser < ActiveRecord::Base
attr_accessible :login, :name, :email # .. and everything else you need to be able to edit through a normal form, but NOT password and password_confirmation
end
然后,您可能希望创建自己的change_password
方法,其中个人用户可以更改其密码。在保存该表单的控制器操作中,您将执行以下操作:
def submit_change_password
@admin_user = current_admin_user
@admin_user.password = params[:password]
@admin_user.password_confirmation = params[:password_confirmation]
if @admin_user.save
..
else
..
end
end
这样他们只能更改自己的密码。