设计:创建没有密码的用户

时间:2015-08-24 15:02:46

标签: ruby-on-rails devise

在我们的应用程序中,我们有普通用户。但是,我们希望能够发出邀请,邀请某些人。请注意,邀请直接与用户相关联,因为我们希望能够为这些用户设置某些设置。 (我们正在将客户从旧软件缓解到新软件)。

所以:

  • 管理员应该能够创建新用户并更改其设置。
  • 当有人关注其invitation_token的链接时,他们应该会看到一个可以为其帐户设置密码的表单。

我遇到的问题是,如何启用管理员创建用户帐户,绕过正常的密码验证。如果需要设置默认密码,这将是一个可怕的解决方案,因为这会造成严重的安全漏洞。

如何在不提供密码的情况下在Devise中创建新用户?

3 个答案:

答案 0 :(得分:44)

至少有两种方法可以做你想做的事情:

方法1:

Overload Devise的password_required?方法

class User < ActiveRecord::Base
  attr_accessor :skip_password_validation  # virtual attribute to skip password validation while saving

  protected

  def password_required?
    return false if skip_password_validation
    super
  end
end

用法:

@user.skip_password_validation = true
@user.save

方法2:

使用validate: false选项禁用验证:

user.save(validate: false)

这将跳过所有字段的验证(不仅是密码)。在这种情况下,您应确保所有其他字段都有效。

<强> ...

但我建议你不要在没有密码的情况下创建用户。我会创建一些额外的表(例如,invitations)并存储所有必需的信息,包括确认后要分配给用户的字段。

答案 1 :(得分:3)

TL; DR:

user.define_singleton_method(:password_required?) { false }

小提琴

class MockDeviseUser
  protected
  def password_required?
    true
  end
end

class User < MockDeviseUser
  def is_password_required?
    puts password_required?
  end
end

unrequired_password_user = User.new
unrequired_password_user.define_singleton_method(:password_required?) { false }
unrequired_password_user.is_password_required?
regular_user = User.new
regular_user.is_password_required?
#false
#true

答案 2 :(得分:0)

您现在可以使用DeviseInvitable宝石了。

它使您可以完全按照自己的要求进行操作。