在我们的应用程序中,我们有普通用户。但是,我们希望能够发出邀请,邀请某些人。请注意,邀请直接与用户相关联,因为我们希望能够为这些用户设置某些设置。 (我们正在将客户从旧软件缓解到新软件)。
所以:
invitation_token
的链接时,他们应该会看到一个可以为其帐户设置密码的表单。我遇到的问题是,如何启用管理员创建用户帐户,绕过正常的密码验证。如果需要设置默认密码,这将是一个可怕的解决方案,因为这会造成严重的安全漏洞。
如何在不提供密码的情况下在Devise中创建新用户?
答案 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宝石了。
它使您可以完全按照自己的要求进行操作。