设计:创建没有密码的用户
在我们的应用中,我们有普通用户。 但是,我们希望能够发出邀请,邀请某些人。 请注意,邀请直接与用户相关联,因为我们希望能够为这些用户设置某些设置。 (我们正在将客户从旧软件缓解到新软件)。
所以:
- 管理员应该能够创建新用户并更改其设置。
- 当有人使用他们的
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