【问题标题】:Devise: lockable - last_attempt_warning not displaying设计:可锁定 - last_attempt_warning 不显示
【发布时间】:2018-11-14 19:44:57
【问题描述】:

我正在尝试按照this wiki 在我的设计中实现:lockable 模块,但遇到了一些问题。在开发中,当登录尝试超过maximum_attempts 次时,failed_attempts 属性会正确更新并且用户帐户会被锁定,但是:

1) 尽管config.last_attempt_warning = true 没有显示警告消息

2) 我收到一封unlock_instructions 电子邮件,但是当我将链接复制粘贴到浏览器时,我收到了invalid authorisation token 错误。

config/initializers/devise.rb

# ==> Configuration for :lockable
config.lock_strategy = :failed_attempts
config.unlock_keys = [:email]
config.unlock_strategy = :email
config.maximum_attempts = 3
config.last_attempt_warning = true

models/user.rb

class User < ApplicationRecord
  devise :database_authenticatable, :confirmable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :lockable
end

视图/设计/会话/新

= flash[:alert] if flash[:alert]
= flash[:notice] if flash[:notice]

= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
  .form-inputs
    = f.input :email, required: false, autofocus: true
    = f.input :password, required: false, autocomplete: "off"
    = f.input :remember_me, as: :boolean if devise_mapping.rememberable?
  .form-actions
    = f.button :submit, "Log in"

db/migrate/YYYYMMDDxxx_add_lockable_to_devise.rb

class AddLockableToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :failed_attempts, :integer, default: 0, null: false
    add_column :users, :unlock_token, :string
    add_column :users, :locked_at, :datetime
    add_index :users, :unlock_token, unique: true
  end
end

我没有任何待处理的迁移,也尝试过重置数据库并重新启动服务器,但没有成功。 关于我做错了什么的任何想法?提前致谢。

【问题讨论】:

  • views/devise/sessions/new 模板中的表单在哪里?该页面肯定不应该只包含几条flash 消息!
  • 至于你的第二个问题,是什么导致了这个错误?您是否可能要求用户在解锁帐户时已经登录(这没有意义)?您是否已验证解锁令牌已正确保存在数据库中?
  • @TomLord 是的,表单显然在那里,我只是认为它不相关,所以我没有粘贴它,但现在可以添加它。至于第二个问题,我没有自己做任何设置,所以我认为我不需要他们登录。我也可以在数据库中看到令牌,但它与电子邮件中的令牌不同所以我不确定如何验证它们是否正确。
  • 如果 db 和 email 中的 token 不同,则 正确!请准确说明您的意思。您在数据库和电子邮件中查看什么?
  • @TomLord 非常感谢您花时间研究我的问题,但也许您可以稍微减少感叹号;-) 我的意思是:User.first.unlock_token =>" 95923c615feeb3781dc2584e339a89bc4c4e9b4710924727f976dcf618f2a707"` 我的邮件生成令牌如下:link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) =&gt; http://localhost:3000/users/unlock?unlock_token=3D6ne-CyRyzgnuHuFSZ2iB。出于安全原因,我正在阅读有关令牌没有按字面意思存储在数据库中的信息,这就是我所说的它们不一样的意思。

标签: ruby-on-rails ruby error-handling devise


【解决方案1】:

经过大量挖掘,我设法解决了这两个问题:

警告信息未显示

第一个问题是由配置引起的:

config/initializers/devise.rb

config.paranoid = true

如果你看看devise module

如果设置为偏执模式,则不要显示锁定消息,因为它 泄露帐户的存在。

根据您的安全要求,您可以将此值更改为 false 或将电子邮件保密而不提供反馈。 如果您有兴趣在尝试登录失败时自定义消息,我强烈建议您阅读this


授权令牌无效

第二个问题是我直接从电子邮件的源代码复制链接引起的 - 因为= 被编码为3D=,所以链接显然被破坏了。进一步解释here

希望这对遇到类似问题的人有所帮助。

【讨论】:

  • 在 8 小时的搜索中找到的最佳答案。泰!
猜你喜欢
  • 2014-06-02
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多