【问题标题】:Pundit with Rails plus User, Admin and Roles ModelsPundit 与 Rails 以及用户、管理员和角色模型
【发布时间】:2015-07-24 03:28:46
【问题描述】:

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

我还希望有一个单独的角色模型,允许客户根据需要混合和匹配他们自己的角色“头衔”。这在实施中也不应该非常困难。

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

我是否应该使用 pundit_user 方法将 Admin 或 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

【问题讨论】:

  • 拥有 2 个模型显然应该是一个具有不同角色的模型,这使得这变得比必要的复杂。
  • @tirdadc 我从不同模型中得到的分离是可取的。了解您来自哪里,但保持不同的模型是我想要用来实现目标的方法。

标签: ruby-on-rails devise pundit


【解决方案1】:

在我的应用程序的可公开访问部分中,使用了 User 模型。默认 Pundit 配置有效,因为 pundit_user 返回 current_user

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

在管理控制器中pundit_user 返回current_administrator

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

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

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

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

在 Rails Admin 中定义为

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2015-05-23
    • 2017-02-15
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多