我有 Pundit 和 Devise 设置并在我的 rails 应用程序中正常工作。但是我不确定如何让用户在注册时决定他们的角色。
眼下:
- 我有一个 URL 参数,它传递给设计新视图。
- 在 form_for 中,我将一个名为 role 的隐藏字段设置为参数的值。
这行得通。
但我担心恶意用户可能会将此参数更改为“管理员”,现在他们是管理员。
我该如何处理?我不想在模型中设置限制,因为这会在我想创建管理员时引起问题。我应该覆盖设计注册控制器以在那里进行检查吗?
我有 Pundit 和 Devise 设置并在我的 rails 应用程序中正常工作。但是我不确定如何让用户在注册时决定他们的角色。
眼下:
这行得通。
但我担心恶意用户可能会将此参数更改为“管理员”,现在他们是管理员。
我该如何处理?我不想在模型中设置限制,因为这会在我想创建管理员时引起问题。我应该覆盖设计注册控制器以在那里进行检查吗?
你不需要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
经过大量的谷歌搜索后,我得到了答案。首先在你的模型中对角色进行一些验证活动记录验证指南:参见 2.6 包含:验证器选项
在此之后,您的角色被验证以确保它们是正确的,您当然也可以有一个查找表。然后你有两个选择:
因此,无论哪种方式,您都需要覆盖注册控制器,这只是一个例子。
我怀疑只有 Pundit 有办法做到这一点。但我还不能让它工作。