我有以下ApiController通过before_action过滤器处理授权:
class ApiController < ApplicationController
before_action :restrict_access
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
ApiKey.exists?(access_token: token)
end
end
end
这很好用。
现在,我有一个来自该Api的控制器,需要使用该ApiKey才能找到关联的用户。所以,我试过这样做:
class OrdersController < ApiController
def index
# How do I access the ApiKey that has been detected in the parent filter?
@user = ApiKey.find_by(access_token: params[:token]).user # This is not working
end
end
这不起作用,因为params [:token]为空,因为令牌在Authorization Token token='xxxx'
之类的授权标头中传递。那么,我怎样才能从我的控制器那里得到它?
答案 0 :(得分:1)
从request.headers['Authorization']
抓取令牌使用以下模式
/(.*)=\"(.*)\"/.match(request.headers["Authorization"])[2]
答案 1 :(得分:0)
非常简单,您应该在身份验证方法中查找您的用户,并将其设置为@current_user
或其他。
然后你可以在所有请求中使用它,并且可以这样做:
class OrdersController < ApiController
def index
@current_user
end
end
你的restrict_accees可能是:
def restrict_access
authenticate_or_request_with_http_token do |token, options|
user = ApiKey.where(access_token: token).includes(:user) #preloads user if available
if user.present?
@current_user = user
true
else
false
end
end
end