2016-07-20 4 views
5

Я пытаюсь заставить Action Cable работать с 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 

Если пользователь вошел в систему я все еще получаю nil от cookies.signed['user.id']

ответ

4

Попробуйте установить куки в надзирателя обратного вызова.

Добавить файл в `конфигурации/Инициализаторы/your_file.rb``

Добавьте к этому файлу:

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 

Или вы могли бы сделать что-то вроде этого:

verified_user = env['warden'].user 

Как объясняется в этом очень приятном туре: https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/

+2

Это хорошо работало для меня кроме того, что мой пользователь не был по умолчанию настройки с завещанию. Для экземпляров, в которых у вас есть другой пользователь, зарегистрированный только, добавьте этот тип пользователя в качестве следующего аргумента, например: 'verfied_user = env ['warden']. User ('admin_user')' – Timbinous

+1

Правильный код выхода: 'Warden :: Manager .before_logout do | пользователь, auth, opts | сфера = выбирает [: сфера] auth.cookies.delete ("# {} Объем .id") auth.cookies.delete ("# {} Объем .expires_at") end' – prograils

6

Обновить 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', 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 

Ссылка: http://tutorials.pluralsight.com/ruby-ruby-on-rails/implementing-a-custom-devise-sign-in-and-actioncable-rails-5?saved=1&status=in-review

+0

Какая версия рельсов/разработать/Уорден, это должно работать? 'env ['warden']. user' всегда nil –

+0

@ArnoldRoa содержит значение только тогда, когда вы уже выполняли аутентификацию где-то еще раньше, то есть уже подписались с использованием классической формы разработки. Это установит куки-файл, и после этого промежуточное ПО стойки смотрителя установит 'env ['warden']. User' по каждому запросу. –

Смежные вопросы