2016-07-20 18 views
5

Ich versuche Action Cable mit Devise zu bekommen.Rails Devise Action Cable

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 

    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
     logger.add_tags 'ActionCable', current_user.name 
    end 

    protected 

    def find_verified_user 
     verified_user = User.find_by(id: cookies.signed['user.id']) 
     if verified_user && cookies.signed['user.expires_at'] > Time.now 
     verified_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end 

Wenn ein Benutzer angemeldet ist ich noch nil von cookies.signed['user.id']

Antwort

4

erhalten Versuchen Sie, das Cookie in einem warden Rückruf Einstellung.

eine Datei `config-Add/initializers/your_file.rb``

Fügen Sie diese in der Datei:

Warden::Manager.after_set_user do |user, auth, opts| 
    scope = opts[:scope] 
    auth.cookies.signed["#{scope}.id"] = user.id 
    auth.cookies.signed["#{scope}.expires_at"] = 60.minutes.from_now 
end 

Warden::Manager.before_logout do |user, auth, opts| 
    scope = opts[:scope] 
    auth.cookies.signed["#{scope}.id"] = nil 
    auth.cookies.signed["#{scope}.expires_at"] = nil 
end 

Oder Sie so etwas tun könnte:

verified_user = env['warden'].user 

Wie in diesem sehr schönen torial erklärt: https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/

+2

Das funktionierte gut für mich, außer dass mein Benutzer war nicht der Standard Sie mit devise einrichten. Für Fälle, in denen ein anderer Benutzer angemeldet ist, fügen Sie einfach diesen Benutzertyp als nächstes Argument hinzu, wie zum Beispiel 'verfied_user = env ['warden']. User ('admin_user')' – Timbinous

+1

Der richtige Logout-Code: 'Warden :: Manager .before_logout do | user, auth, opts | scope = setzt [: scope] auth.cookies.delete ("# {Umfang} .id") auth.cookies.delete ("# {Umfang} .expires_at") end' – prograils

6

Aktualisieren Sie Ihre connection.rb mit dem folgenden:

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
     logger.add_tags 'ActionCable', current_user.studentid 
    end 

    protected 

    def find_verified_user # this checks whether a user is authenticated with devise 
     if verified_user = env['warden'].user 
     verified_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end 

-Link: http://tutorials.pluralsight.com/ruby-ruby-on-rails/implementing-a-custom-devise-sign-in-and-actioncable-rails-5?saved=1&status=in-review

+0

Welche Version von Schienen/ersinnen/Wärter soll das funktionieren? 'env ['warden']. user 'ist immer null –

+0

@ArnoldRoa es enthält einen Wert nur, wenn Sie die Authentifizierung bereits woanders zuvor durchgeführt haben, d. h. bereits mit einem klassischen Geräteformular angemeldet sind. Dadurch wird ein Cookie gesetzt und danach wird die Rack-Middleware von Warden den 'env [' warden ']. User' bei jeder Anfrage setzen. –