Rails 5 ActionCable 设置和工作流程

Rails 5 ActionCable setup and workflow

我是 ActionCable 和套接字的新手,正在尝试实现一些实时功能。

我成功地在我的应用程序中实现了实时通知功能(基本功能),但是有几件事我花了一些时间来理解。

我的实时通知代码:

认证过程:

# Connection.rb (using Devise)
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = env['warden'].user
      reject_unauthorized_connection unless self.current_user

      logger.add_tags 'ActionCable', current_user.email
    end

  end
end

通知渠道:

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    stream_from "notification_channel_#{current_user.id}"
  end

  def unsubscribed
  end
end

Notifications.coffee

App.notifications = App.cable.subscriptions.create "NotificationsChannel",
  connected: ->

  disconnected: ->

  received: (data) ->
    this.update_counter(data.counter)

    # if use_sound is "true" play a mp3 sound
    # use_sound is sent ("true" or "false") because when a notification is destroyed we don't want to use sound only update counter  

    if data.use_sound == "true"
      $("#sound-play").get(0).play()

  # Update Notifications Counter and change color

  update_counter: (counter) ->
    $("#notifications-counter").html("#{counter}")

    if counter > 0
      $("#notifications-counter").css('color','#FFA5A5')
    else
      $("#notifications-counter").css('color','white')

还有作业文件,我们在其中广播到带有通知计数器的频道

注意:我只发送通知计数,因为在导航栏中,当用户单击(例如 2 个通知)- 按钮时,会通过 AJax 调用切换和填充下拉菜单。

我的问题是:

  1. 当用户未登录时,总是'GET /cable'请求响应'An unauthorized connection attempt was rejected'是否正常(我知道current_user在Connect.rb 文件是从 cookie 设置的,但是当用户在 ex 主页、登录页面等时。基本上没有经过身份验证。

    在服务器日志中,我可以每 1.2 秒看到一次 GET /cable

    这正常吗?我在想,如果用户注销或其他原因,我必须以某种方式停止它。

  2. 当我启动服务器时,出现以下错误大约 10 秒,直到服务器在浏览器控制台中启动。由于通知有效,我不知道这是不是问题,但确实是错误。

    与 'ws://localhost:3000/cable' 的 WebSocket 连接失败:连接建立时出错:net::ERR_CONNECTION_REFUSED

    我什至尝试设置 config.action_cable.mount_path = "/cable" 或 "ws://localhost:3000/cable" 但没有修复它。

  3. 接下来我要实现一个聊天功能,2个用户可以私聊,是Connection.rb'secure'中定义的"current_user",如何实现我向 ActionCable 或类似的东西添加授权。在我的应用程序的其余部分,我使用的是 CanCan Gem 并且运行良好。

非常感谢您花时间阅读这个问题。如果您对我的问题有答案,我将不胜感激。如果您有一些指导或提示来构建与 ActionCable 的复杂而安全的聊天,我很乐意听取他们的意见。谢谢!

我认为您要查看的是调用 createConsumer 函数的 cable.js 文件。

创建消费者就是为频道订阅用户。我认为您需要关注此代码何时被调用。

您正在使用用户身份验证的存在来拒绝未经授权的使用。

这非常好,但是当为任何访问者创建 JS 消费者时就不是那么好(即 cable.js 被加载到所有页面的 application.js)。

你可以做的是将 content_for 用于经过身份验证的用户的单独布局,调用 cable.js 来创建消费者并确保 cable.js 不会包含在未经授权的页面中.