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

Qqw*_*qwy 19 ruby-on-rails devise

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

所以:

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

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

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

chu*_*off 51

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

方法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
Run Code Online (Sandbox Code Playgroud)

用法:

@user.skip_password_validation = true
@user.save
Run Code Online (Sandbox Code Playgroud)

方法2:

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

user.save(validate: false)
Run Code Online (Sandbox Code Playgroud)

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

...

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

  • 解释为什么你不建议没有密码创建用户会很有趣. (2认同)

fab*_*tag 5

TL; DR:

user.define_singleton_method(:password_required?) { false }
Run Code Online (Sandbox Code Playgroud)

小提琴:

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
Run Code Online (Sandbox Code Playgroud)