由于 Doorkeeper 是一个孤立的引擎,我们无法访问您在ApplicationController
. 但是如果你需要一个 current_user 怎么办?这里有什么解决方法?
第一个想法是猴子补丁ActionController::Base
。有更好的想法吗?
由于 Doorkeeper 是一个孤立的引擎,我们无法访问您在ApplicationController
. 但是如果你需要一个 current_user 怎么办?这里有什么解决方法?
第一个想法是猴子补丁ActionController::Base
。有更好的想法吗?
我的门卫实现在基本应用程序中,所以如果您使用单独的引擎,这将无济于事,但如果您使用相同的 rails 应用程序,我将在这里分享:
class ApplicationController < ActionController::Base
protect_from_forgery
private
def current_user
if doorkeeper_token
return current_resource_owner
end
# fallback to auth with warden if no doorkeeper token
warden.authenticate(:scope => :user)
end
# Needed for doorkeeper find the user that owns the access token
def current_resource_owner
User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end
end
除非没有答案,可能我自己的脏猴子补丁会对某人有用。
在初始化程序/action_controller_patch.rb 中:
module ActionController
Base.class_eval do
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
end
end
我想你可以在这个页面上找到它。
https://github.com/applicake/doorkeeper/wiki/Using-Resource-Owner-Password-Credentials-flow
我正在使用凭证身份验证模式,所以在我的情况下这是有效的。
Doorkeeper.configure do
resource_owner_from_credentials do |routes|
request.params[:user] = {:email => request.params[:username], :password => request.params[:password]}
request.env["devise.allow_params_authentication"] = true
request.env["warden"].authenticate!(:scope => :user)
end
end