1

我的 active_admin 上有以下内容,这只是 admin_user 模型的默认设置。这允许所有 admin_user 更改所有其他 admin_user 的密码。有谁知道我可以如何限制 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
4

2 回答 2

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
于 2013-03-05T10:21:58.090 回答
0

另一种方法可能是从该表单中删除密码和密码确认字段并创建“更改密码”操作,甚至可能是“我的帐户”页面,您可以在其中更改密码。

第三种方法可能是仅在您编辑“自己”时显示密码字段,如下所示:

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 您确实还希望防止用户更改帖子参数以更改其他人的密码。同样,有选项 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

这样他们就只能更改自己的密码。

于 2013-03-05T14:06:20.380 回答