我想创建一个用于访问API的自定义身份验证策略。我按照Devise ignoring custom strategy上的示例代码进行了操作。
问题是有效吗?我的Api策略中的方法永远不会运行(基于试图撬开它)。
我的代码:
module Devise
module Strategies
class Api < Devise::Strategies::Base
def valid?
binding.pry
params[:request_source] == 'api'
end
def authenticate!
#do stuff here
if user
success!(user)
else
warden.custom_failure!
render :json=> {:success=>false, :message=>"Error with your login or password"}, :status=>401
end
end
end
Warden::Strategies.add(:api, Devise::Strategies::Api)
end
end
并在设计初始化程序中:
config.warden do |manager|
manager.default_strategies.unshift :api
end
我做什么,似乎Devise总是使用默认策略。 AFAIK,这应该够了......
------- -------- EDIT
我在设计初始化程序的顶部需要这样的策略:
require Rails.root.join('app/devise/strategies/api')
我知道策略是在启动时加载的,因为如果我在类中放入一个pry调用,它将启动一个pry会话。但是方法内部的Pry调用永远不会运行。 :-S
答案 0 :(得分:4)
找到了答案!
我必须使用它:
config.warden do |manager|
manager.default_strategies(scope: :user).unshift :api
end
让它发挥作用。奇怪的是,我在网上看到的很多示例代码都没有使用它:-S
答案 1 :(得分:0)
您何时需要自定义策略?与示例相比,您在此处添加策略而不是在初始化程序中。您可以尝试在初始化程序的顶部要求自定义策略,以确保在将其添加到default_strategies之前加载它。
如果这不起作用,不要害怕在设计中添加一些临时put语句,其中调用authenticate来检查default_strategies。也就是说,如果你使用调试器还不是很舒服,那就是我要做的。