关于设计可锁定的第n次尝试的自定义消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于设计可锁定的第n次尝试的自定义消息相关的知识,希望对你有一定的参考价值。

我正在寻找一种方法来为设计可锁定模块中的各种失败尝试显示自定义消息。

我发现默认情况下只能通知最后一次尝试:https://github.com/plataformatec/devise/blob/master/lib/devise/models/lockable.rb#L121

是否有任何优雅的方式来显示不同的警告信息,例如第7次和第8次失败的尝试?你能提出一个吗?

答案

也许是一个自定义的SessionsController,我猜这个设计使用动态方法,我找不到:调用last_attempt只是覆盖unauthenticated_message方法

def create
    if self.resource.failed_attempts != self.resource.class.maximum_attempts - 1 and self.resource.failed_attempts != 0
        attempts_left = self.resource.failed_attempts
        flash[:alert] = I18n.t 'some_path.errors.attempts', attempts_left: attempts_left
    super
end

想法是在最大尝试次数为1次或小于最大次数时添加闪光警报,在最大尝试次数和最后一次尝试的情况下,您将获得默认消息

另一答案

这个想法很有意思但不起作用,因为lockablecreate之前被调用,所以我创建了一个自定义动作,我在create之前调用它。

这对我有用:

class User::SessionsController < Devise::SessionsController
  before_action :check_failed_attempts, only: :create

  def after_sign_in_path_for(user)
    # some code
  end

  def create
    super
    # create some stuff and check others
  end

  def destroy
    # may be destroy and deal with cookies
    super
  end

  def check_failed_attempts
    flash.clear

    email = self.params["user"]["email"]
    return unless email

    user = User.find_by_email(email)
    return unless user

    failed_attempts = user.failed_attempts
    maximum_attempts = User.maximum_attempts
    attempts_left = maximum_attempts - failed_attempts - 1
    if attempts_left != maximum_attempts and attempts_left > 1
      flash[:notice] = I18n.t 'devise.failure.n_attempt', attempts_left: attempts_left
    end
  end
end

以上是关于关于设计可锁定的第n次尝试的自定义消息的主要内容,如果未能解决你的问题,请参考以下文章

带有圆角而不是 100% 屏幕宽度的自定义片段对话框

片段中的自定义列表适配器

找到我的自定义代码片段 Xcode 6?

片段中的自定义列表视图。未找到布局

为片段制作自定义列表视图?

具有获取 json 值的片段中的自定义适配器