7

在我的 Rails 应用程序网站中,访问者可以注册并创建内容。它使用带有用户模型的设计,一切正常。

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

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

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

谢谢!

4

2 回答 2

5

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

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

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

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 也更加灵活。

于 2014-12-12T18:25:56.640 回答
0

补充蒙克布罗克答案:

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

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 specific routes

于 2015-04-29T03:03:02.140 回答