由于Doorkeeper是一个独立的引擎,因此我们无法访问您在ApplicationController
中所做的任何操作。但是如果你需要一个current_user呢?什么可能是一个解决方法在这里?访问Gatekeeper中的current_user覆盖版面
第一个想法是猴子补丁ActionController::Base
。有更好的想法吗?
由于Doorkeeper是一个独立的引擎,因此我们无法访问您在ApplicationController
中所做的任何操作。但是如果你需要一个current_user呢?什么可能是一个解决方法在这里?访问Gatekeeper中的current_user覆盖版面
第一个想法是猴子补丁ActionController::Base
。有更好的想法吗?
除非没有答案,否则可能是我自己的肮脏的猴子补丁会对别人有用。
在初始化/ 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
我看门执行是基本的应用程序的内部,这不会帮助,如果你使用的是单独的引擎,但会,如果你使用相同的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