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

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

所以:

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

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

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

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

方法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选项禁用validation:

 user.save(validate: false) 

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

...

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

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