Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有多个设计模型的Actioncable身份验证_Ruby On Rails_Devise_Ruby On Rails 5_Actioncable - Fatal编程技术网

Ruby on rails 具有多个设计模型的Actioncable身份验证

Ruby on rails 具有多个设计模型的Actioncable身份验证,ruby-on-rails,devise,ruby-on-rails-5,actioncable,Ruby On Rails,Devise,Ruby On Rails 5,Actioncable,我目前正在实现我的两个Desive模型之间的聊天客户端和专业人员。目前它工作正常,但我只有一个渠道:每个客户或专业人士都会收到来自所有客户和专业人士的所有信息。显示很好,但是观看AJAX流的人可以看到每一条不适合他们的私人消息 根据这条线索,这被称为单一责任原则 因此,我试图创建“子流”,以便向正确的用户广播 我的第一步是用Desive创作。我使用的是经典: module ApplicationCable class Connection < ActionCable::Connecti

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

根据这条线索,这被称为单一责任原则

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

我的第一步是用Desive创作。我使用的是经典:

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
但当专业人员登录时,一切正常:

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在客户端或Professionel被记录时都会显示与管理员相关的id:

["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="] 
我不明白错误从何而来

编辑

刚刚在Desive initializer中找到这段代码:

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

好的,答案很简单:如果您有多个Desive帐户要授权到Actioncable,您必须为每个帐户设置scope 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
模块应用程序表
类连接

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

好的,答案很简单:如果你有多个Desive帐户要授权到Actioncable,你必须为每个帐户设置scope 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
模块应用程序表
类连接

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

我注意到professionel cookie有一个CSRF令牌,而客户端没有。。。这有关系吗?实际上,两者都显示了CSRF令牌,但它只在登录后的第一次页面更改或页面刷新时才会显示。Professionnel在专用页面上登录,但客户端在根页面上登录。当我以专业人员身份登录时,我必须返回root以查看我在root视图上实现的cookie,然后CSRF加起来。但当我以客户端身份登录并重新加载root时,CSRF也会被添加(Actioncable authing没有任何更改)有人似乎有像我一样的异常行为:但在我的情况下,Warden env不是空的。只是它没有被识别或检索。嗨@TarynEast我用一些可能有意义的东西编辑了我的问题。你看到这个范围问题的解决方案了吗?当我在routes中切换Desive模型的第一个和第二个位置时,客户端将获得授权!!!这似乎是问题所在…谢谢你提到这一点。所有的设计部分都运行良好,但我将添加一条路径,看看是否有任何变化。所有模型都是资源,并具有额外的自定义路径。关于典狱长,这是固定的。但是Actioncable很难。例如,我可以看到人们在互联网上的一些线程上使用通道文件中的参数。但对我来说,频道文件既不是erb文件,也不是可以作为表单接收者的控制器。。很多事情都不会像我这样的乞丐认为的那样我注意到professionel cookie有一个CSRF令牌,而客户端没有。。。这有关系吗?实际上,两者都显示了CSRF令牌,但它只在登录后的第一次页面更改或页面刷新时才会显示。Professionnel在专用页面上登录,但客户端在根页面上登录。当我以专业人员身份登录时,我必须返回root以查看我在root视图上实现的cookie,然后CSRF加起来。但当我以客户端身份登录并重新加载root时,CSRF也会被添加(Actioncable authing没有任何更改)有人似乎有像我一样的异常行为:但在我的情况下,Warden env不是空的。只是它没有被识别或检索。嗨@TarynEast我用一些可能有意义的东西编辑了我的问题。你看到这个范围问题的解决方案了吗?当我在routes中切换Desive模型的第一个和第二个位置时,客户端将获得授权!!!这似乎是问题所在…谢谢你提到这一点。所有的设计部分都运行良好,但我将添加一条路径,看看是否有任何变化。所有模型都是资源,并具有额外的自定义路径。关于典狱长,这是固定的。但是Actioncable很难。例如,我可以看到人们在互联网上的一些线程上使用通道文件中的参数。但对我来说,频道文件既不是erb文件,也不是可以作为表单接收者的控制器。。很多事情都不像我这样的乞丐认为的那样