Rails active_admin:如何限制admin_user更改其他admin_users的密码?

时间:2013-03-05 09:59:09

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 activeadmin

我的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

2 个答案:

答案 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

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