2016-07-20 13 views
5

Próbuję podłączyć Action Cable do Devise.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 

Jeśli użytkownik jest zalogowany w I jeszcze dostać nil z cookies.signed['user.id']

Odpowiedz

4

Spróbuj ustawić cookie w Strażnikiem zwrotnego.

Dodaj plik do `config/inicjalizatory/your_file.rb``

Dodaj do tego pliku:

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 

Albo można zrobić coś takiego:

verified_user = env['warden'].user 

Jak wyjaśniono w tym bardzo miłym tekście: https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/

+2

Ten pracował dobrze dla mnie chyba, że ​​mój użytkownik nie był domyślnym ustawieniu z devise. W przypadku instancji, w których zalogowany jest inny użytkownik, należy dodać ten typ użytkownika jako następny argument, tak jak w przypadku 'verfied_user = env ['warden']. User ('admin_user')' – Timbinous

+1

Właściwy kod wylogowania: 'Warden :: Manager .before_logout do | user, auth, optts | scope = opts [: scope] auth.cookies.delete ("# {scope} .id") auth.cookies.delete ("# {scope} .expires_at") end' – prograils

6

Zaktualizuj swój connection.rb z następujących czynności:

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

Jaka wersja szyn/devise/Warden to ma działać? 'env ['warden']. user' is always nil –

+0

@ArnoldRoa zawiera wartość tylko wtedy, gdy już wcześniej wykonałeś uwierzytelnienie w innym miejscu, tzn. już zalogowałeś się przy użyciu klasycznej aplikacji. Spowoduje to ustawienie pliku cookie, a następnie program pośredniczący w szafie sterowniczej ustawi użytkownika 'env ['warden']. 'Na każdym żądaniu. –

Powiązane problemy