ruby-on-rails - 重置设计 rails 的密码会导致“没有将数组隐式转换为字符串”错误
问题描述
我正在尝试使用默认设计密码控制器#create 方法重置密码,并且当设计尝试生成令牌时收到错误消息。这是使用 Rails 服务器进行开发的中断。
我没有自定义密码控制器,我只是使用此方法的默认设计控制器。
我已经尝试过搜索,但没有发现类似的问题,除了Ruby on Rails:没有将 Array 隐式转换为看起来不相关的 String (DEVISE)。我尝试清除 Rails 缓存并使用隐身浏览器,但这并没有改变任何东西。我现在正在寻找其他可以尝试的东西,但似乎正在碰壁。
配置:
设计使用用户名而不是电子邮件进行身份验证:
config.authentication_keys = [:username]
config.reset_password_keys = [:username]
我的用户被归类为“User::Admin”等,它看起来像:
class User < ApplicationRecord
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
validates :email, uniqueness: true
validates :username, uniqueness: true
validates :user_type, presence: true
self.inheritance_column = :user_type
我的带有堆栈跟踪的日志:
Started POST "/users/password" for 127.0.0.1 at 2018-07-16 14:27:44 -0700
Processing by Users::PasswordsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"rS7qFIRbbpd/M3QoAD1OLeDRDoliWAQK+PRE/qG2CgK2COvwwVCNFA6aMpcY0P81AEKo0fEpfNe4SRqLk7WDAw==", "user"=>{"username"=>"timtim"}, "commit"=>"Send me reset password instructions"}
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."username" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["username", "timtim"], ["LIMIT", 1]]
↳ /Users/timchipperfield/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.0/lib/active_record/log_subscriber.rb:98
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.9ms)
TypeError (no implicit conversion of Array into String):
/Users/timchipperfield/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb:14:in `pbkdf2_hmac'
/Users/timchipperfield/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb:14:in `pbkdf2_hmac'
/Users/timchipperfield/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb:19:in `pbkdf2_hmac_sha1'
activesupport (5.2.0) lib/active_support/key_generator.rb:23:in `generate_key'
activesupport (5.2.0) lib/active_support/key_generator.rb:38:in `generate_key'
devise (4.4.3) lib/devise/token_generator.rb:29:in `key_for'
devise (4.4.3) lib/devise/token_generator.rb:17:in `generate'
devise (4.4.3) lib/devise/models/recoverable.rb:90:in `set_reset_password_token'
devise (4.4.3) lib/devise/models/recoverable.rb:51:in `send_reset_password_instructions'
devise (4.4.3) lib/devise/models/recoverable.rb:136:in `send_reset_password_instructions'
devise (4.4.3) app/controllers/devise/passwords_controller.rb:15:in `create'
如果有帮助,堆栈跟踪“在”它到达控制器之前还有很多。
我正在以乘客作为我的应用程序服务器运行设计(4.4.3)
我的环境看起来像:
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
Rails 5.2.0
Bundler version 1.16.2
rvm 1.29.3
解决方案
由于您使用的是 Rails 5.2.0,我猜您也替换secret_key_base
为encrypted credentials
. 但是,默认情况下,设计仍然尝试使用 secret_key_base 来生成安全散列。
您应该会收到类似于此的错误:
TypeError in User::PasswordsController#create
no implicit conversion of Hash into String
def pbkdf2_hmac(pass, salt, iter, keylen, digest)
OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
length: keylen, hash: digest)
end
有两个选项可以解决此问题:
1)config.secret_key
在初始化程序/devise.rb 中取消注释:
config.secret_key = 'SOME_RANDOM_VALUE'
2) 将其添加SOME_RANDOM_VALUE
到 encrypted_credentials:
首先运行:
rails credentials:edit
添加与此类似的行:
devise:
secret_key: SOME_RANDOM_VALUE
然后从设计初始化程序调用该键:
config.secret_key = Rails.application.credentials.devise[:secret_key]
推荐阅读
- java - 无法使用java客户端访问docker for windows中的rabbitmq
- android - 在 Audio Manager 对象上发送额外数据以确保 android.media.RINGER_MODE_CHANGED Action Receiver 接收到此信息
- postgresql - Postgres/jOOQ 替换 jsonb[] 元素
- excel - 堆叠数据并添加折线
- python - 如何用虚线连接散点图的点?
- symfony - Symfony 5 httpClient Windows AD 连接
- r - 将数据框中的列分成其他几列
- .net - 突然得到:HTTP 请求未经授权,客户端身份验证方案“协商”
- python - 从每个客户 id 的下一列中识别最后一个 yes 值和 0,然后从上一行下一列 pandas 中获取值
- google-cloud-platform - 为什么使用 JVM Google Cloud Functions 连接到 MongoDB Atlas 这么慢?