Rails_admin 有设计

Rails_admin with devise

我已经 Rails_admin 安装了 devise,我想将 /admin 仪表板限制为仅供管理员使用。目前我的代码看起来像:

config.authenticate_with do
    warden.authenticate! scope: :user
  end

config.current_user_method(&:current_user)

如您所见,用户可以进入仪表板,所以我只希望用户 table 的管理列中的布尔值为 true 的用户可以访问仪表板。

你建议我怎么做?

我建议您使用名为 cancancan (is the updated version of cancan) it's super easy to use and it will let you to give certain permissions to different kind of users. If you don't know nothing about this gem i will recommend you to see this railscasts 的授权 gem,它将教您如何正确使用它。

因此,在 ability.rb 文件中安装了 cancancan gem 之后,您只需要执行类似这样的操作来限制管理员访问权限

models/ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user && user.admin?
      can :access, :rails_admin       # only allow admin users to access Rails Admin
      can :dashboard           
      can :manage, :all
    else
      can :read, :all                   # allow everyone to read everything
    end
  end
end

并且不要忘记告诉 rails_admin gem 您正在使用 cancancan 来验证授权

config/initializers/rails_admin.rb

RailsAdmin.config do |config|

  ## == Cancan ==
  config.authorize_with :cancan

end

要使用 "user.admin?" 方法,您必须将其创建到用户模型中,但只有当您具有 has_many 用户和用户 belongs_to 角色的角色模型时,它才会起作用,否则您将需要其他方式来验证角色,所以它会像这样

models/role.rb

has_many :users

models/user.rb

belongs_to :role

def admin?
  role_id == 0 # If you have id == 0 for admin
end

此外,我会建议您使用角色模型或枚举来轻松管理不同的角色。

希望对您有所帮助:D

如果你不想使用 cancan,你可以这样做:

config.authorize_with do
    redirect_to main_app.root_path unless current_user.try(:admin?)
end

我用这个,效果很好。