validationActionCable连接

我找到了一个很棒的ActionCablegem,这是SPA的一个很好的解决方案。

我想只发送htmlcssjs资产,所有其他连接都将通过ActionCable实现。 交换字符串或整数并不困难,但我如何通过ActionCable登录?

从自述文件

 # 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 if current_user = User.find(cookies.signed[:user_id]) current_user else reject_unauthorized_connection end end end end 

所以看起来你可以在这里插入自己的find_verified_user逻辑。 reject_unauthorized_connection方法位于lib/action_cable/connection/authorization.rb以供参考。

来自Heroku :

[authentication]可以通过多种方式完成,因为WebSockets将通过常用于身份validation的标准HTTP头。 这意味着您可以使用与WebSocket连接上的Web视图相同的身份validation机制。

由于您无法从JavaScript自定义WebSocket标头,因此您只能使用从浏览器发送的“隐式”身份validation(即基本或cookie)。 此外,将处理WebSockets的服务器与处理“正常”HTTP请求的服务器完全分开是很常见的。 这可能使共享授权标头变得困难或不可能。

考虑到这一点,如果不使用普通的Web登录流来设置您的身份validationcookie,在身份validation步骤之后交付SPA,可能会感到非常痛苦,但希望这可以为您提供一些指导。

仅供参考,如果您已在应用程序中安装了设备,则可以使用warden设置的环境变量来查找经过authenticated user 。 对于每个经过身份validation的用户,warden将用户对象存储在环境var中。 每个请求都由warden中间件进行身份validation。

注意 :这个env与ENV不同。

 module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user_from_env end private def find_verified_user_from_env # extracting `user` from environment var current_user = env['warden'].user if current_user current_user else reject_unauthorized_connection end end end end 

如果您还没有使用过devise那么这是另一种解决方案。 前提条件是,您必须在sessions_controller设置一个名为user_id的签名cookie或类似的东西。 例如

 cookies.signed[:user_id] = current_user.id 

并用于连接:

 # 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_from_cookies end private def find_verified_user_from_cookies current_user = User.find_by_id(cookies.signed[:user_id]) if current_user current_user else reject_unauthorized_connection end end end end 

解决方案是使用HTTP授权令牌。 这很简单,广泛而且显而易见。 这篇文章给了我很多帮助