具有多个Devise模型的Actioncable身份验证

时间:2018-04-16 20:52:53

标签: ruby-on-rails devise ruby-on-rails-5 actioncable

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

根据此帖子http://www.thegreatcodeadventure.com/rails-5-action-cable-with-multiple-chatroom-subscriptions/,这称为单一责任原则

所以我试图创建"子流"为了向合适的用户广播。

我的第一步是使用Devise进行身份验证。我正在使用经典:

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

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

    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"}

1 个答案:

答案 0 :(得分:3)

好的答案很简单:如果您有多个Devise帐户要授权进入Actioncable,您必须为每个帐户设置范围,在我的情况下,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

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