1

我有 Pundit 和 Devise 设置并在我的 rails 应用程序中正常工作。但是我不确定如何让用户在注册时决定他们的角色。

眼下:

  • 我有一个 URL 参数,它传递给设计新视图。
  • 在 form_for 中,我将一个名为 role 的隐藏字段设置为参数的值。

这行得通。

但我担心恶意用户可能会将此参数更改为“管理员”,现在他们是管理员。

我该如何处理?我不想在模型中设置限制,因为这会在我想创建管理员时引起问题。我应该覆盖设计注册控制器以在那里进行检查吗?

4

2 回答 2

1

你不需要RegistrationsController为你想要做的事情重写设计。

如果您希望管理员能够创建具有任意角色集的用户,您可以简单地使用您自己的控制器。设计仍然可以很容易地自己创建用户,因此您只需要制作一个控制器来处理它。当然,不要忘记使用 Pundit 对其进行保护,这样只有管理员才能使用此功能。

如果您使用该Confirmable模块,这种方法仍然有效。但是,由于在创建用户时不会发送确认电子邮件,因此您要么必须user.confirm!在保存模型后立即调用以立即解锁帐户,要么使用手动发送确认电子邮件user.send_confirmation_instructions

编辑:

此 Pundit 政策可能适用于您尝试做的事情,也可能不适用。您必须在此处覆盖createDevise 的操作RegistrationsController才能使用 Pundit 的authorize方法。为了干燥起见,您还应该将角色列表移到其他地方,也许是模型中。

class UserPolicy < Struct.new(:current_user, :target_user)    
  def create?
    registration_roles.include?(target_user.role) if current_user.nil?
  end

  private

  def registration_roles
    %w(RED BLU Spectator)
  end
end
于 2014-04-10T16:25:09.860 回答
1

经过大量的谷歌搜索后,我得到了答案。首先在你的模型中对角色进行一些验证活动记录验证指南:参见 2.6 包含:验证器选项

在此之后,您的角色被验证以确保它们是正确的,您当然也可以有一个查找表。然后你有两个选择:

  1. 对新记录使用条件 before_save回调。然后检查新记录是否具有您保护的角色,如果是则引发错误。稍后捕获(在覆盖的设计控制器中(参见第二个选项)。
  2. 覆盖设计注册控制器请参阅此 SO 问题。并在完全覆盖的创建操作中进行一些检查。使用会话存储传递给新操作的 url 参数(也需要完全覆盖)。然后,如果创建操作失败并重定向到新的,您仍然可以访问会话中的角色(因为参数将从 URL 中清除,除非您对其进行操作)。

因此,无论哪种方式,您都需要覆盖注册控制器,这只是一个例子。

我怀疑只有 Pundit 有办法做到这一点。但我还不能让它工作。

于 2014-04-10T09:29:39.790 回答