Rails 5
, apartment gem
трос действия connection.rb
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user, :tenant
def connect
self.tenant = request.subdomain
Apartment::Tenant.switch!(tenant)
self.current_user = find_verified_user
logger.add_tags 'ActionCable', current_user.try(:email) || 'Unauthenticated User'
end
protected
def find_verified_user # this checks whether a user is authenticated with devise
if verified_user = env['warden'].user
verified_user
else
# May have public users accessing the channels
# reject_unauthorized_connection
end
end
end
end
среда/производство.рб
config.action_cable.allowed_request_origins = [ /https://(.*).mydomain.com/ ]
Пробовал приведенную выше ссылку на код, взятую из этих ссылок: Ссылка 1 и Ссылка 2, но не работает.
В производстве: request.subdomain
это nil
(пробовал использовать горячее кодирование некоторых значений арендатора, но не работает)
В разработке: request.subdomain
указывает имя арендатора, но фактический запрос не работает.
Любая помощь?
Исправлена эта проблема:
request.subdomain
не работает и возвращает "". В качестве альтернативы я передал значение арендатора через строку запроса
const getWebSocketURL = () => {
var protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
var host = window.location.host;
var path = '/cable';
var url = protocol + host + path;
return `${url}?tenant=mytenant`;
};
и
const wsUrl = getWebSocketURL();
const cable = ActionCable.createConsumer(wsUrl);
соединение.rb:
self.tenant = request.params[:tenant]
Также внутри ваших каналов в каждом методе должна быть ваша первая строка
Apartment::Tenant.switch!(tenant)
здесь вы можете получить значения арендатора из комнаты
см. также эти ссылки:
кабель с инструкциями по настройке арендатора в действии
rails-actioncable-request-origins-субдомен