使用具有多种识别方法的 ActionCable
Using ActionCable with multiple identification methods
我使用 ActionCable 在 Rails 5.1 应用程序上开发了一个 Ruby。 User authentification via Devise 适用于多个频道。现在,我想添加一个不需要任何用户身份验证的 第二种渠道 。更准确地说,我想让匿名网站访问者能够与支持人员聊天。
我当前为经过身份验证的用户实施的 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
) 识别。
问题:
如何最好地添加这种新型频道?我可以在某处添加一个布尔标志 require_authentification
,在我继承的通道 class 中覆盖它以进行匿名通信,并根据此属性切换 Connection
中的识别方法吗?或者我宁愿实现一个全新的模块,比如 AnonymousApplicationCable
?
您好,我遇到了同样的问题,在 rails github 评论中查看了您的解决方案后,我认为最好创建令牌并将逻辑保留在连接方法中。
所以我所做的只是利用 warden 检查,如果它是 nil,则创建匿名令牌,否则。为此,我需要声明 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
我使用 ActionCable 在 Rails 5.1 应用程序上开发了一个 Ruby。 User authentification via Devise 适用于多个频道。现在,我想添加一个不需要任何用户身份验证的 第二种渠道 。更准确地说,我想让匿名网站访问者能够与支持人员聊天。
我当前为经过身份验证的用户实施的 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
) 识别。
问题:
如何最好地添加这种新型频道?我可以在某处添加一个布尔标志 require_authentification
,在我继承的通道 class 中覆盖它以进行匿名通信,并根据此属性切换 Connection
中的识别方法吗?或者我宁愿实现一个全新的模块,比如 AnonymousApplicationCable
?
您好,我遇到了同样的问题,在 rails github 评论中查看了您的解决方案后,我认为最好创建令牌并将逻辑保留在连接方法中。
所以我所做的只是利用 warden 检查,如果它是 nil,则创建匿名令牌,否则。为此,我需要声明 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