0

私は新しい Rails 5 (RC1) アプリに取り組んでいます。ユーザー認証に AuthLogic を使用しましたが、ActionCable に到達するまでは、いつもどおりうまく機能します。

#app/channels/application_cable/connection.rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = UserSession.find
    end
  end
end

エラーが表示されます: オブジェクトを作成する前にコントローラー オブジェクトで Authlogic::Session::Base.controller をアクティブにする必要があります

私は試した:

Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)

しかし、Connection クラスは Controller ではないため、これは機能しません。

AuthLogic コードを確認しましたが、コントローラー オブジェクトへの依存をバイパスする方法がわかりません。ユーザーのセッションをロードするだけです。何かご意見は?

4

2 に答える 2

5

私は自分でそれを理解しました。基本的に ApplicationController で AuthLogic persistence_token を使用して安全な Cookie を設定すると、このトークンを読み取って手動で ActionCable にユーザーをロードできます。

class ApplicationController < ActionController::Base
  before_action :set_verify_cookie

  def set_verify_cookie
    #action cable needs a way outside of controller logic to lookup a user
   return unless current_user
    cookies.signed[:vvc] = current_user.persistence_token
  end
end

#app/channels/connection.rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user


    def connect
      self.current_user = find_verified_user
      logger.add_tags 'ActionCable', self.current_user.username unless self.current_user.nil?
    end

    protected

    def find_verified_user_or_guest
      User.find_by(:persistence_token => cookies.signed[:vvc])
    end
end

考えられる落とし穴の 1 つは、ログアウト時に Cookie をクリアする必要があることです。そうしないと、ActionCable はその後のページ読み込みでユーザーを見つけます。

#app/controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController

  def destroy
    cookies.signed[:vvc] = nil
    current_user_session.destroy
    flash[:success] = "Logout successful!"
    redirect_to root_url
  end
end
于 2016-06-14T23:11:18.547 に答える