在我的rails应用程序网站中,访问者可以注册并创建内容。它使用设计用户模型,一切运作良好。
现在我想使用rails_admin来管理网站资源和用户等,只有拥有管理上限的人才能访问它。
我应该为管理面板访问创建单独的AdminUser模型,还是使用admin角色的用户模型,并使用一些授权库来管理访问。
如果我只使用一个型号,那么我希望用户在登录后重定向到管理面板,如果用户是管理员,如果不是,那么我希望用户被重定向到他们的个人资料。哪个授权库可以是cancan或pundit 更适合我的情况。
谢谢!
答案 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