设计:创建没有密码的用户
Devise: Create users without password
在我们的应用程序中,我们有普通用户。但是,我们希望能够发出邀请,邀请某些人。请注意,邀请直接与用户关联,因为我们希望能够为这些用户设置某些设置。 (我们正在减轻客户从旧软件到新软件的负担)。
所以:
- 管理员应该能够创建新用户并更改其设置。
- 当有人使用
invitation_token
关注 link 时,他们应该会看到一个表格,他们可以在其中为其帐户设置密码。
我遇到的问题是如何让管理员绕过正常的密码验证来创建用户帐户。如果需要设置默认密码,那将是一个糟糕的解决方案,因为这会造成严重的安全漏洞。
如何在不提供密码的情况下在 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。
它可以让你完全按照你的要求去做。
在我们的应用程序中,我们有普通用户。但是,我们希望能够发出邀请,邀请某些人。请注意,邀请直接与用户关联,因为我们希望能够为这些用户设置某些设置。 (我们正在减轻客户从旧软件到新软件的负担)。
所以:
- 管理员应该能够创建新用户并更改其设置。
- 当有人使用
invitation_token
关注 link 时,他们应该会看到一个表格,他们可以在其中为其帐户设置密码。
我遇到的问题是如何让管理员绕过正常的密码验证来创建用户帐户。如果需要设置默认密码,那将是一个糟糕的解决方案,因为这会造成严重的安全漏洞。
如何在不提供密码的情况下在 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。
它可以让你完全按照你的要求去做。