1

如果他们刚刚登录,我想authentication_token在我的 JSON 响应中包含一个用户,以便我的 API 的使用者可以跟踪它并验证未来的请求。但我不想包含令牌。我正在使用 Active Model Serializers 来自定义我的 JSON 输出:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :authentication_token

  def include_authentication_token?
    # what to put here?
  end
end

Devise 会话控制器使用respond_with resourcewhere 资源是登录用户,因此默认情况下它将使用 UserSerializer。我可以自定义设计控制器,但我更愿意使用include_authentication_token?. Devise 中是否有一些方法会在用户刚登录时返回 true(即响应来自 Devise::SessionsController)?

4

2 回答 2

0

虽然当前 Request 在您的子类中不会自动可用ActiveModel::Serializer,但您可以通过将其options包含在对UserSerializer.new.

如果您显式创建序列化程序,例如:

UserSerializer.new(@user, scope: current_user)

这意味着您可以简单地传递第二个选项,称为request

UserSerializer.new(@user, scope: current_user, request: request)

从那时起,您可以通过调用来访问序列化程序中的当前请求options[:request]。例如,要检查内部的当前控制器UserSerializer,只需检查

options[:request].params[:controller]

如果它显示为"devise/sessions",则可以包含令牌。否则,如果您使用标准的 Devise 控制器来处理登录,您可能必须将Devise::SessionsController登录子类化并重新路由到新控制器:

# app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, location: after_sign_in_path_for(resource), request: request
  end
end

# config/routes.rb
devise_scope :user do
  post "sign_in" => "sessions#create", as: :user_session
end

请注意,我尚未对此进行测试。在阅读的源代码ActionController::MimeResponds#respond_with,似乎给出的任何选项#respond_with都将向下传递给响应者,该响应者被劫持,ActionController::Serialization并且看起来选项一直传递resource的序列化器中。

祝你好运!

于 2013-03-19T04:14:48.330 回答
-1

也许这会对你有所帮助。

- (布尔)signed_in?(范围=无)

并在stackoverflow上 设计如何在自定义会话控制器中添加登录检查

于 2013-03-19T04:15:59.587 回答