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

Devise: Create users without password

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

所以:

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

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

至少有两种方法可以满足您的需求:

方法一:

重载 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

方法二:

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

user.save(validate: false)

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

...

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

TL;DR:

user.define_singleton_method(:password_required?) { false }

Fiddle:

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

您现在可以为此使用 DeviseInvitable gem。

它可以让你完全按照你的要求去做。