2016-06-07 17 views
0

Ich arbeite an einer neuen Rails 5 (RC1) -App. Ich habe AuthLogic für die Benutzerauthentifizierung verwendet, und es funktioniert wie immer gut, bis ich zu ActionCable komme.AuthLogic zur Arbeit mit 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 

ich den Fehler: Sie haben die Authlogic aktivieren muss :: Session :: Base.controller mit einem Controller-Objekt vor dem Erstellen von Objekten

Ich habe versucht:

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

Aber das ist nicht funktionieren, weil die Connection-Klasse kein Controller ist.

Ich schaue auf den AuthLogic-Code, aber ich kann nicht herausfinden, wie die Abhängigkeit von einem Controller-Objekt umgehen. Ich muss nur die Sitzung des Benutzers laden. Irgendwelche Gedanken?

Antwort

3

Ich habe es selbst herausgefunden. Ich fühle, dass es eine Art Hacky ist, im Grunde in meinem ApplicationController setze ich ein sicheres Cookie mit dem AuthLogic persistence_token, dann kann ich dieses Token lesen und den Benutzer manuell in ActionCable laden.

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 

Eine mögliche Gotch, muss das Cookie beim Abmelden oder ActionCable gelöscht wird noch die Benutzer auf nachfolgender Seite geladen finden.

#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 
+0

Sehr schöne Lösung! Gute Antwort. Bitte editieren Sie diese Zeile: 'self.current_user = find_verified_user' Für:' self.current_user = find_verified_user_or_guest' – ZombieBsAs

0

Angenommen, Sie verwenden Authlogic Standard, die Persistenz-Token werden in dem Cookie unter dem Schlüssel 'user_credentials' gespeichert.

So können Sie Ihre Benutzer wie diese Nachschlag:

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

    def connect 
     verify_user 
    end 

    private 
    def verify_user 
     reject_unauthorized_connection unless verified_user? 
    end 

    def verified_user? 
     cookie_key && User.find_by_persistence_token(token) 
    end 

    def token 
     cookie && cookie.include?('::') && cookie.split("::")[0] 
    end 

    def cookie 
    cookies['user_credentials'] 
    end 

    end 
end