繁体   English   中英

设计的自定义身份验证策略使用:token_authenticable

[英]Custom Authentication Strategy for Devise Using :token_authenticable

我想知道如何使用devise :token_authenticable实现自定义身份验证策略。

我已经找到了如何使用devise :database_authenticatable进行模型的说明devise :database_authenticatable这里有介绍。

我试图验证的模型被命名为Pupil 所以这是我当前的策略(位于config/initializers/custom_auth.rb ):

Warden::Strategies.add(:auth_pupil_strategy) do
  # missing valid? method indicates this strategy is always applied

  def authenticate!
    fail!("YOU SHALL NOT PASS!")
  end
end

在我的config/initializers/devise.rb (也试过没有:scope => :pupil ):

config.warden do |manager|
  manager.default_strategies(:scope => :pupil).unshift :auth_pupil_strategy
end

所以这应该导致用户无法登录,但是当从devise :token_authenticable devise :database_authenticatable切换到devise :token_authenticable时,不会以某种方式应用此策略。

也许我只是错过了右边:scope在这里。

现在,这是奇怪的事情:每当用户输入无效令牌时,我的策略被调用并且“你不应该通过!” 退回。 但是,当提供正确的令牌时,用户可以正常登录。

您的策略未被调用,因为您需要覆盖有效的策略? 这个答案建议的方法;

但是你也应该使用默认策略方法,但是它的使用方式是另一种,让我们看一下声明

def default_strategies(*strategies)
  opts  = Hash === strategies.last ? strategies.pop : {}
  hash  = self[:default_strategies]
  scope = opts[:scope] || :_all

  hash[scope] = strategies.flatten unless strategies.empty?
  hash[scope] || hash[:_all] || []
end

正如你所看到的那样,该方法应该接收一系列策略,不仅仅是范围,使用unshift是一个聪明的黑客,它将你的策略放在堆的顶端,但由于某些原因,当使用多个自定义策略时出现意外行为

希望有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM