使用ActionCable,多种识别方式

2023-12-30

我使用 ActionCable 开发 Ruby on Rails 5.1 应用程序。通过 Devise 进行用户身份验证 https://rubytutorial.io/actioncable-devise-authentication/适用于多个频道。现在,我想添加一个第二类渠道不需要任何用户身份验证。更准确地说,我希望匿名网站访问者能够与支持人员聊天。

我目前的实施ApplicationCable::Connection对于经过身份验证的用户,如下所示:

# app/channels/application_cable/connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    protected

    def find_verified_user
      user = User.find_by(id: cookies.signed['user.id'])
      return user if user
      fail 'User needs to be authenticated.'
    end
  end
end

匿名用户将通过一些随机的 UUID 来识别(SecureRandom.urlsafe_base64 https://ruby-doc.org/stdlib-2.2.3/libdoc/securerandom/rdoc/SecureRandom.html#method-c-urlsafe_base64).

问题:

如何最好地添加这种新型渠道?我可以添加一个布尔标志吗require_authentification某处,在我继承的通道类中重写它以进行匿名通信,并切换识别方法Connection取决于这个属性?或者我宁愿必须实现一个全新的模块,比如说AnonymousApplicationCable?


您好,我遇到了同样的问题,在查看 Rails github 评论中的解决方案后,我认为最好创建令牌并将逻辑保留在 connect 方法中。

所以我所做的只是利用典狱长检查,如果为零,则创建匿名令牌,否则。为此,我需要声明 2 个标识符:uuid 和:current_user

class Connection < ActionCable::Connection::Base
identified_by :current_user, :uuid


 def connect

   if !env['warden'].user
     self.uuid = SecureRandom.urlsafe_base64
   else
     self.current_user = find_verified_user
   end

 end

 protected

 def find_verified_user # this checks whether a user is authenticated with devise

   if verified_user = env['warden'].user

     verified_user
   else

     reject_unauthorized_connection
   end
 end

end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用ActionCable,多种识别方式 的相关文章

  • Rails 6:每个用户只能创建一个配置文件

    我目前正在开发 Rails 6 应用程序 我有以下关联 用户有一个配置文件 并且配置文件属于用户 当编辑用户的配置文件时 我最终为该用户提供了两个配置文件 我希望每个用户只有一份个人资料 编辑表单 profile edit html erb
  • 表情符号未正确保存在 mongodb 中

    我正在将 Twitter 和 Instagram 上的表情符号保存到我的 mongodb 数据库中 但是当我显示从数据库中提取的数据时 表情符号看起来像这样破损了 在将数据保存到 mongodb 期间我需要做一些不同的事情吗 我是 mong
  • 在 ruby​​ 中使用 Blowfish 加密字符串返回的字符串比 php 中的相同过程要短

    这让我很困惑 当我尝试使用以下输入用 Blowfish 加密字符串时 key 某个键 输入 输入字符串 我得到以下结果 ruby 79af8c8ee9220bde php 79af8c8ee9220bdec2d1c9cfca7b13c6 我
  • Windows 等效的系统配置目录

    我正在 Ruby 中开发一个 CLI 应用程序 我希望允许通过标准配置文件级联在 Unix 中进行配置 etc appnamerc appnamerc 然而 该应用程序也应该在 Windows 环境中运行 我不确定将像这样的文件放在哪里 e
  • 自动将 JSON 对象映射到 Ruby 中的实例变量

    我希望能够自动将 JSON 对象解析为实例变量 例如 使用此 JSON require httparty json HTTParty get http api dribbble com players simplebits gt shots
  • Rails 中 WHERE 子句中的 ALL 运算符

    关联关系如下图所示 InstructorStudent has many fees Fee belongs to instructor student 我想要获得在所有给定数组中具有每月详细信息的指导学生 如果其中任何一个中不存在每月详细信
  • 使用yard创建文档时如何防止[查看源代码]链接?

    我正在使用yard生成项目文档 但我不想在文档中显示 查看源代码 链接 我已深入研究yard官方指南 但仍然没有得到解决方案 有什么想法吗 谢谢 我可能有点晚了 但您可以通过从 method details 部分中删除 源 部分来轻松自定义
  • has_many 关系中的 Active Record 对象何时保存?

    我正在使用 Rails 1 2 3 是的 我知道 并且对如何使用感到困惑has many适用于对象持久性 为了举例 我将使用它作为我的声明 class User lt ActiveRecord Base has many assignmen
  • 为什么递归会出现“堆栈级别太深”?

    我有这个红宝石代码 def get sum n return 0 if n lt 1 n 3 0 n 5 0 n get sum n 1 get sum n 1 continue execution end puts get sum 999
  • Rails - 连接多个表

    我有以下型号 class Company lt ActiveRecord Base has many price movements has many goods movements end class PriceMovement lt A
  • rake cucumber 和 rake spec 始终使用“开发”环境

    我运行 Cucumber 和 RSpec 测试的 rake 任务始终使用我的development环境 以下是相关的配置文件 RAILS ROOT config environments cucumber rb Edit at your o
  • 使用 Paperclip 保存文件而不上传

    我有一个简短的问题 是否可以保存文件而不实际通过表单上传 例如 假设我正在查看电子邮件中的附件 并且我想使用回形针保存它们 我该怎么做呢 我是否必须在某处手动调用 save file 或类似的东西 任何帮助将非常感激 我有一个 rake 任
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • 对构建过程依赖于与另一个容器通信的应用程序进行 Docker 化

    我有一个 Ruby on Rails 应用程序 我正在尝试对其进行容器化 以便可以使用 Docker 进行部署 version 3 4 services db image postgres web container name my rai
  • Ruby:创建日期范围

    我正在寻找一种优雅的方式来制作一系列日期时间 例如 def DateRange start time end time period end gt gt results DateRange DateTime new 2013 10 10 1
  • 装饰 Rails 中的属性

    我有一个name上的属性Person模型 每次我访问name属性 我想要name capitalize被退回 在模型内执行以下操作将不起作用 def name name capitalize end 那么还有什么选择呢 我建议您使用自定义格
  • 黄瓜测试java例子?

    我想尝试使用黄瓜测试的示例应用程序 黄瓜测试可以仅使用 ruby 完成 也可以使用 java 完成 请帮我举一个示例 谢谢 您可以查看我们在我们这里编写的一个简单示例来演示 cucumber jvm https github com gph
  • 使用 Paperclip 和 Multipart 请求将文件上传到 Rails JSON API 服务器

    我想将文件从 Android 客户端上传到 Rails JSON API 服务器 我正在从 Android 客户端发送一个 Multipart form 请求 如下所示 Content Type multipart form data bo
  • 从哈希中删除 nil 值

    我希望从哈希中删除具有nil value article是一个存储每篇文章的类 并且attributes方法将文章存储为散列 预期结果 articles results author null title Former bar manage
  • 用于验证网络路径的正则表达式 PHP、jQuery、JavaScript、Ruby

    尝试找出用于验证网络路径的正则表达式 即 comp xyz or comp or comp x y z storage或者所有部分都更长的东西 但希望能够传达其要点 我目前拥有的是一个简单的输入字段 用户可以通过它传递信息 事情是我不希望他

随机推荐

  • 等待 Task.Run 与等待

    我在网上搜索了一下 看到很多关于Task Run与await async相比 但是有一个特定的使用场景 我不太理解其中的区别 我相信场景很简单 await Task Run gt LongProcess vs await LongProce
  • C# 拖放:拖动时显示拖动的项目

    我正在使用 C 和 Windows 窗体构建桌面应用程序 我有一个自定义控件 我希望能够将其拖放到我的应用程序内 而不是外部 现在我正在使用通常的 DoDragDrop OnDragOver OnDragDrop 方法来实现它 有没有什么方
  • 如何在php mysql中获取结果的所有行?

    在我的表中我有 2 条记录companyid 1 但是当我运行下面的 php 时companyid 1它只返回第一个 如何获取所有记录 php 文件 if isset GET companyid companyid GET companyi
  • R:将数据帧转换为三维数组?

    我想转换一个数据框 例如 day lt c 1 1 1 2 2 2 3 3 3 area lt c A B C area lt rep area 3 measure1 lt c 99 97 95 102 105 98 103 98 90 m
  • 查找将两个 Numpy 数组平均划分的值

    我有两个数组 x1 and x2 具有相同长度且具有重叠的值范围 我需要找到一个值q这样l1 l2被最小化 并且 l1 x1 np where x1 gt q shape 0 l2 x2 np where x2 lt q shape 0 我
  • FragmentActivity 中的“setSupportActionBar(toolbar)”?

    我如何访问setSupportActionBar Toolbar toolbar inside FragmentActivity 我无法访问里面的内容FragmentActivity toolbar Toolbar findViewById
  • Phoenix 和 Ecto 以及 SELECT

    我在凤凰城建立了一个 Ecto 模型协会 一个组织有许多组织成员 在 OrganizationMember 控制器的 Edit 方法中 我尝试创建一个 SELECT 元素来保存所有可供选择的组织 在里面edit定义 我有以下两行 organ
  • 为什么使用“composer create-project”创建项目后,依赖项不是最新的可用版本?

    因为某些原因 composer create project命令似乎会拉出过时的依赖项版本 运行后create project if I chdir创建文件夹并运行composer update 下载较新的版本 aherne aherne
  • R 将数据框从长格式重塑为宽格式? [复制]

    这个问题在这里已经有答案了 将下面的数据帧从长格式转换为宽格式的最佳方法是什么 我尝试使用重塑但没有得到预期的结果 2015 PROD A test1 2015 PROD A blue 2015 PROD A 50 2015 PROD A
  • Cython 中是否可以使用 C++ 风格的内部 typedef?

    在 C 中 可以声明作为类或结构成员的类型别名 struct Foo internal type alias typedef int DataType 有没有办法在 Cython 中做同样的事情 我尝试过最明显的方法 cdef struct
  • SystemInfo - 通过 CMD 获取计算机系统模型 - 额外空格错误

    我正在尝试通过批处理文件获取计算机系统模型类型 为此我创建了这个脚本 systeminfo find System Model gt temp TEMPSYSINFO txt for F tokens 2 delims a in temp
  • 验证 Spring Web 应用程序配置的最佳实践

    我希望我的基于 Spring 的 Web 应用程序能够validate它在启动期间的配置 这意味着例如 检查是否所需文件夹存在并且可读 可写 检查是否符合要求配置键已设定且一致 检查任何其他约束这是正确运作所必需的 您如何执行这些检查和no
  • 如何从 Quart 获取事件循环

    你好 我对 Python 相当陌生 我正在尝试将 Flask 上的现有应用程序转换为 Quart https gitlab com pgjones quart https gitlab com pgjones quart 它应该构建在 as
  • 使用 SVM 进行实时面部表情分类

    我目前正在开发一个项目 我必须提取用户的面部表情 一次只能从网络摄像头提取一个用户 例如悲伤或快乐 我对面部表情进行分类的方法是 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试进行面部表情分类 SVM
  • LNK2019 错误 C++ 无法解析的外部符号

    我收到这些错误消息 错误1错误LNK2019 未解决 外部符号 public void thiscall ArrayIntStorage sortOwn void sortOwn ArrayIntStorage QAEXXZ 函数中引用 m
  • 莱斯的教学目的?

    目的是什么les汇编指令 为什么我们需要加载es部分and寄存器 书中给出了以下例子 les bx p Load p into ES BX mov es bx al Store away AL 为什么我们需要加载es and bx在这种情况
  • node.js 检查远程 URL 是否存在

    如何在不下拉的情况下检查 URL 是否存在 我使用以下代码 但它会下载整个文件 我只需要检查它是否存在 app get api v1 urlCheck function req res var url req query url var r
  • 如何在具有隔离范围的指令中侦听站点范围的事件

    我正在使用具有隔离范围的指令在 angularjs 中创建自定义图表小部件 这个想法是 每个小部件在收到有关如何创建自身的基本配置信息后应该能够独立存在 该小部件将通过侦听 update data 事件与应用程序的其他部分进行通信 当事件被
  • 如何在 SQLite 中插入具有唯一 ID 的重复行?

    这看起来很简单 我想在 SQLite 表中复制一行 INSERT INTO table SELECT FROM table WHERE rowId 5 如果没有显式的唯一列声明 则该语句将起作用 但声明了表的第一列rowID INTEGER
  • 使用ActionCable,多种识别方式

    我使用 ActionCable 开发 Ruby on Rails 5 1 应用程序 通过 Devise 进行用户身份验证 https rubytutorial io actioncable devise authentication 适用于