Rails_admin:我应该有admin_user或具有admin角色的用户来管理用户和管理面板

时间:2014-11-24 10:34:40

标签: ruby-on-rails devise cancan rails-admin pundit

在我的rails应用程序网站中,访问者可以注册并创建内容。它使用设计用户模型,一切运作良好。

现在我想使用rails_admin来管理网站资源和用户等,只有拥有管理上限的人才能访问它。

我应该为管理面板访问创建单独的AdminUser模型,还是使用admin角色的用户模型,并使用一些授权库来管理访问。

如果我只使用一个型号,那么我希望用户在登录后重定向到管理面板,如果用户是管理员,如果不是,那么我希望用户被重定向到他们的个人资料。哪个授权库可以是cancan或pundit 更适合我的情况。

谢谢!

2 个答案:

答案 0 :(得分:5)

好问题。我在我的项目中使用Rails Admin和Pundit。

我更喜欢将Admin模型与User模型分开。

一个原因是我希望能够从Rails管理员“成为用户”,以便在遇到问题时能够帮助他们。当您拥有单独的User和Admin模型时,它更容易实现。

Admin模型可以非常简单。用它生成它 rails generate devise Admin

然后在config/initializers/rails_admin.rb添加

config.authenticate_with do
  warden.authenticate! :scope => :admin
end

config.current_user_method(&:current_admin)

要重定向到正确的配置文件,请将此方法添加到ApplicationController

def after_sign_in_path_for(resource)
  if resource.class == Administrator
    rails_admin_path
  else
    # Change profile_path to where you want regular users to go
    stored_location_for(resource) || profile_path
  end
end

为了防止从当前用户退出时从当前管理员退出,请在config/initializers/devise.rb

中设置此配置
config.sign_out_all_scopes = false

为了解决您的其他问题,我使用了CanCan和Pundit。我更喜欢Pundit,因为使用CanCan可以为每个请求评估所有权限。使用Pundit,只在需要时才会检查权限。 Pundit在我的经历中也更灵活。

答案 1 :(得分:0)

补充monkbroc答案:

对我来说,在RoR 4中,变量:admin和:current_admin从未工作过。看到一些关于这个问题的页面,Warden没有注册这个角色,当时Devise不是一个模型而是一个枚举...并找到了另一个这样的解决方案:

config.authorize_with do |controller|
  unless current_user.try(:admin?)
   flash[:error] = "You are not an admin"
   redirect_to 'visitors#index'
 end
end

代码来自另一个答案:Authenticate using Devise and Rails Admin for particular routes