Pundit 与 Rails 加上用户、管理员和角色模型

Pundit with Rails plus User, Admin and Roles Models

Rails_admin: Should I have admin_user or user with admin role to manage users and admin panel I'm wanting to adopt Pundit 之后,因为它对应用程序的策略优雅。该应用程序同时具有用户模型和管理模型 - 一个用于客户,另一个用于员工。它也是多租户的,尽管这不会对问题产生太大影响。

我还想要一个单独的角色模型,允许客户根据需要混合搭配他们自己的 "title" 角色。这在实施中应该不会非常困难。

困难的部分是支持 Pundit 策略以支持两种不同的用户模型 - 用户(客户)和管理员(员工)。

我是否应该使用 pundit_user 方法将管理员或用户设置为 pundit_user(基于通过 current_user 和 current_admin_user) 还是有其他方法。我没有找到关于这个用例的很多好的文档(除了 short line on github)。

def pundit_user
  if !current_admin_user.nil?
    current_admin_user
  elsif !current_user.nil?
    current_user
  else
    nil
  end        
end

在我的应用程序的可公开访问部分,使用了用户模型。自 pundit_user returns current_user.

以来默认的 Pundit 配置有效

在我的应用程序的管理部分,使用了管理员模型。原因之一是管理员可以在模拟用户时保持登录状态(查看他们在个人资料中看到的内容并帮助解决问题)。

在管理员控制器中 pundit_user returns current_administrator.

在RailsAdmin中,当前用户设置为当前管理员:

config.authenticate_with do
  warden.authenticate! :scope => :administrator
end
config.current_user_method(&:current_administrator)

虽然我没有在 Rails 管理员中使用授权(所有管理员都拥有所有权力),但您应该可以使用 rails_admin_pundit gem,因为它可以

@controller.class.send(:alias_method, :pundit_user, :_current_user)

在 Rails 管理中定义为

def _current_user
  instance_eval(&RailsAdmin::Config.current_user_method)
end