使用 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