使用 Rails 生成器创建的设计用户无法登录
Devise user created with Rails generator cannot sign in
我正在开发一个 Rails 引擎,它将依赖于 Devise。
我使用 Rails 生成器 创建了一个安装程序,您可以找到 here。安装程序创建第一个凭据以便稍后访问管理面板。
问题是我无法使用这些凭据登录。奇怪的是,如果我删除该帐户并通过 Rails 控制台重新创建它,它们就会起作用。我认为这是由于安装程序期间发生的事情造成的。
这里是它的一个片段:
# Binda installer generator ...
def setup_devise
return if Rails.env.production?
# Copy the initilializer on the application folder
template 'config/initializers/devise.rb'
# Add secret key
inject_into_file 'config/initializers/devise.rb', after: "config.secret_key = '" do
SecureRandom.hex(64)
end
# Add pepper
inject_into_file 'config/initializers/devise.rb', after: "config.pepper = '" do
SecureRandom.hex(64)
end
# some other code for mailer ...
end
def create_credentials
@username = ask("What's your email? ['mail@domain.com']").presence || 'mail@domain.com'
@password = ask("What's your password? ['password']").presence || 'password'
Binda::User.create( email: @username, password: @password, password_confirmation: @password )
# Binda installer generator continue ...
Here 完整代码。
更多信息
我发现即使我修改了 devise.rb
文件,新配置也不会在安装程序结束时加载。这意味着在创建第一个用户时不考虑新的 salt/pepper。 如何在 运行 create_credentials
方法之前重新加载它?
已排序!
问题是,如果您将 salt/pepper 配置添加到应用程序的 devise.rb
,您需要重新加载环境才能使用新设置创建用户。
为此,我将用户创建移到了任务中。这样安装程序就可以重新加载环境(和设计配置)并能够正确设置加密密码。
安装程序
# lib/generators/myEngine/install/install_generator.rb
def create_credentials
rake 'binda_create_initial_user'
end
任务
# lib/tasks/binda.rake
desc "Create initial user"
task :binda_create_initial_user => :environment do
username = 'mail@domain.com'
password = 'password'
Binda::User.create!( email: username, password: password, password_confirmation: password )
end
如果您想继续询问邮箱和密码:
# lib/tasks/binda.rake
desc "Create first user"
task :binda_create_initial_user => :environment do
STDOUT.puts "What is your email? [mail@domain.com]"
username = STDIN.gets.strip
username = 'mail@domain.com' if username.blank?
STDOUT.puts "What is your password? [password]"
password = STDIN.gets.strip
password = 'password' if password.blank?
Binda::User.create!( email: username, password: password, password_confirmation: password )
end
我正在开发一个 Rails 引擎,它将依赖于 Devise。
我使用 Rails 生成器 创建了一个安装程序,您可以找到 here。安装程序创建第一个凭据以便稍后访问管理面板。
问题是我无法使用这些凭据登录。奇怪的是,如果我删除该帐户并通过 Rails 控制台重新创建它,它们就会起作用。我认为这是由于安装程序期间发生的事情造成的。
这里是它的一个片段:
# Binda installer generator ...
def setup_devise
return if Rails.env.production?
# Copy the initilializer on the application folder
template 'config/initializers/devise.rb'
# Add secret key
inject_into_file 'config/initializers/devise.rb', after: "config.secret_key = '" do
SecureRandom.hex(64)
end
# Add pepper
inject_into_file 'config/initializers/devise.rb', after: "config.pepper = '" do
SecureRandom.hex(64)
end
# some other code for mailer ...
end
def create_credentials
@username = ask("What's your email? ['mail@domain.com']").presence || 'mail@domain.com'
@password = ask("What's your password? ['password']").presence || 'password'
Binda::User.create( email: @username, password: @password, password_confirmation: @password )
# Binda installer generator continue ...
Here 完整代码。
更多信息
我发现即使我修改了 devise.rb
文件,新配置也不会在安装程序结束时加载。这意味着在创建第一个用户时不考虑新的 salt/pepper。 如何在 运行 create_credentials
方法之前重新加载它?
已排序!
问题是,如果您将 salt/pepper 配置添加到应用程序的 devise.rb
,您需要重新加载环境才能使用新设置创建用户。
为此,我将用户创建移到了任务中。这样安装程序就可以重新加载环境(和设计配置)并能够正确设置加密密码。
安装程序
# lib/generators/myEngine/install/install_generator.rb
def create_credentials
rake 'binda_create_initial_user'
end
任务
# lib/tasks/binda.rake
desc "Create initial user"
task :binda_create_initial_user => :environment do
username = 'mail@domain.com'
password = 'password'
Binda::User.create!( email: username, password: password, password_confirmation: password )
end
如果您想继续询问邮箱和密码:
# lib/tasks/binda.rake
desc "Create first user"
task :binda_create_initial_user => :environment do
STDOUT.puts "What is your email? [mail@domain.com]"
username = STDIN.gets.strip
username = 'mail@domain.com' if username.blank?
STDOUT.puts "What is your password? [password]"
password = STDIN.gets.strip
password = 'password' if password.blank?
Binda::User.create!( email: username, password: password, password_confirmation: password )
end