具有多个Devise模型的Actioncable身份validation

我目前正在实现两个Devise模型之间的聊天。 ClientProfessionnel 。 目前工作正常,但我只有一个渠道:每个客户或专业人员都会收到来自所有客户和所有专业人士的所有消息。 显示很好,但是观看他们的AJAX流的人可以看到每个不适合他们的私人消息。

根据这个主题http://www.thegreatcodeadventure.com/rails-5-action-cable-with-multiple-chatroom-subscriptions/这被称为单一责任原则

所以我试图创建“子流”,以便向正确的用户广播。

我的第一步是使用Devise进行authing。 我正在使用经典:

 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.email end protected def find_verified_user if verified_user = env['warden'].user verified_user else reject_unauthorized_connection end end end end 

这就是出现问题的地方:当客户端登录时,Actioncable不会创建连接:

 Started GET "/cable" for 127.0.0.1 at 2018-04-16 22:30:28 +0200 Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-04-16 22:30:28 +0200 Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: keep-alive, Upgrade, HTTP_UPGRADE: websocket) An unauthorized connection attempt was rejected 

但当Professionel登录时,一切都还可以:

 Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: keep-alive, Upgrade, HTTP_UPGRADE: websocket) Professionnel Load (0.4ms) SELECT "professionnels".* FROM "professionnels" WHERE "professionnels"."id" = $1 ORDER BY "professionnels"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]] [ActionCable] [dummy@gmail.com] Registered connection (Z2lkOi8vcm9vZnNlZWRzL1Byb2Zlc3Npb25uZWwvMQ) 

这很奇怪,因为会话cookie显示与warden相关的id,无论是在记录Client还是Professionel时:

 ["session_id", "0c3649a0e924de3fbf14dbb1cf2ce058"] ["flash", {"discard"=>[], "flashes"=>{"notice"=>"Connecté."}}] ["professionnel_return_to", "/"] ["warden.user.client.key", [[1], "$2a$12$auNvgciv6qPDf7n5a93vXu"]] ["session_id", "43a9b6db09311473419d7f22f2ce6419"] ["flash", {"discard"=>[], "flashes"=>{"notice"=>"Connecté."}}] ["warden.user.professionnel.key", [[1], "$2a$12$qZ4whbN3e2w7fn8NJWa/B."]] ["professionnel_return_to", "/"] ["_csrf_token", "sZA8gze5lxU6R71XUci0uQDXVk+d75VslI90ImcjwhA="] 

我不知道错误来自哪里..

编辑编辑

刚刚在Devise初始化程序中找到了这段代码:

  # Configure the default scope given to Warden. By default it's the first # devise role declared in your routes (usually :user). # config.default_scope = :user 

Professionnel确实是我在我的路线中宣布的第一个Devise角色。 它与我的问题有什么关系吗? 我该如何解决这个问题?

  devise_for :professionnels, controllers: {registrations: "professionnels/registrations", passwords: "professionnels/passwords", confirmations: "professionnels/confirmations"} devise_for :clients, controllers: {registrations: "clients/registrations", passwords: "clients/passwords", confirmations: "clients/confirmations"} devise_for :admins, controllers: {registrations: "admins/registrations", sessions: "admins/sessions"} 

好的答案很简单:如果您有多个Devise帐户要授权进入Actioncable,那么您必须为每个帐户设置warden范围,在我的情况下,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.email end protected def find_verified_user if verified_user = env["warden"].user(:professionnel) verified_user elsif verified_user = env["warden"].user(:client) verified_user else reject_unauthorized_connection end end end end 

在这种情况下,我给他们相同的标识符,因为聊天室是他们两个的孩子,所以我(猜我)可以对待它们相同。 我认为如果需要,可以给他们不同的标识符。