1

通关守卫的例子似乎都在检查signed_in?。这让我很困惑,因为它似乎signed_in?不应该设置为 true,直到用户通过了安全防护。我认为警卫的全部目的是防止登录。

class EmailConfirmationGuard < Clearance::SignInGuard
  def call
    if unconfirmed?
      failure("You must confirm your email address.")
    else
     next_guard
    end
  end

  def unconfirmed?
    signed_in? && !current_user.confirmed_at
  end
end
4

1 回答 1

2

如果用户是 ,我想不出为什么要运行保护堆栈的原因nil,所以我不确定。我认为这可能是实施的意外。

创建会话时,我们这样做:

def create
  @user = authenticate(params)

  sign_in(@user) do |status|
    if status.success?
      redirect_back_or url_after_create
    else
      flash.now.notice = status.failure_message
      render template: "sessions/new", status: :unauthorized
    end
  end
end

如果authenticate返回nil,我们仍然进入堆栈。我们可能应该考虑不这样做。如果您在 Clearance 存储库本身上打开问题,我们可以将其视为对 Clearance 2.0 的更改

于 2016-05-03T15:21:05.250 回答