gpt4 book ai didi

ruby-on-rails - 使用具有多种识别方法的 ActionCable

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:14 25 4
gpt4 key购买 nike

我使用 ActionCable 开发了一个 Ruby on Rails 5.1 应用程序。 User authentification via Devise适用于多个 channel 。现在,我想添加一个不需要任何用户身份验证的第二类 channel 。更准确地说,我想让匿名网站访问者能够与支持人员聊天。

我当前为经过身份验证的用户实现的 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 ) 进行识别。

问题:

如何最好地添加这种新型 channel ?我可以在某处添加一个 bool 标志 require_authentification ,在我继承的 channel 类中覆盖它以进行匿名通信,并根据此属性切换 Connection 中的识别方法吗?或者我宁愿实现一个全新的模块,比如 AnonymousApplicationCable

最佳答案

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

所以我所做的只是利用 warden 检查,如果它是 nil 就创建匿名 token ,否则就创建匿名 token 。为此,我需要声明 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

关于ruby-on-rails - 使用具有多种识别方法的 ActionCable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com