如何为rails_admin设置管理员凭据?

时间:2014-12-23 04:20:17

标签: ruby-on-rails rails-admin

安装并设置用户登录设备后,我继续添加了rails_admin gem。现在,如果我去localhost:3000 / admin我可以访问管理仪表板,但如何添加管理员身份验证,以便您需要输入管理员凭据才能访问管理仪表板?

3 个答案:

答案 0 :(得分:1)

我建议您使用名为cancancan的授权gem(是cancan的更新版本),它非常易于使用,它可以让您为不同类型的用户提供某些权限。如果您对此宝石一无所知,我会建议您查看this railscasts,它将教您如何正确使用它。

所以在你在ability.rb文件中安装了cancancan gem后,你只需要做这样的事情来限制管理员访问

模型/ 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来验证授权

配置/初始化/ rails_admin.rb

RailsAdmin.config do |config|

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

end

要使用“user.admin?”您必须将其创建到用户模型中的方法,但只有当您拥有一个具有__用户和用户belongs_to角色的角色模型时才会起作用,否则您将需要其他方式来验证角色,因此它将是这样的

模型/ role.rb

has_many :users

模型/ user.rb

belongs_to :role

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

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

我希望它有所帮助:D

答案 1 :(得分:0)

routes.rb

authenticate :admin do
  mount RailsAdmin::Engine => 'rails_admin', as: :rails_admin
end

答案 2 :(得分:0)

为用户提供管理员角色,以便您可以进行测试,例如user.admin?

配置rails_admin以从您的应用程序控制器继承并捕获除已登录的admin用户以外的任何访问权限。

#config/initializers/rails_admin.rb
RailsAdmin.config do |config|
   ...
  config.parent_controller = 'ApplicationController'
  config.authenticate_with do
    # current_user =  User.find_by_id(session[:user_id])
    raise InvalidAdminAccess, 'Access denied.' unless current_user.try(:admin?)
  end
end

在中定义InvalidAdminAccess错误类

# app/errors/invalid_admin_access.rb
class InvalidAdminAccess < StandardError
end

在应用程序控制器中捕获错误

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  ...
  rescue_from InvalidAdminAccess do |exception|
    respond_to do |format|
      format.json { head :forbidden, content_type: 'text/html' }
      format.html { redirect_to main_app.root_url, alert: exception.message }
      format.js   { head :forbidden, content_type: 'text/html' }
    end
  end
end

通过这种方式,当访问不正确时,rails_admin会触发由应用程序控制器捕获并处理的异常。