我在ActionCable中验证用户是这样的:
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
self.current_user = find_verified_user
logger.add_tags 'ActionCable', current_user.name
end
protected
def find_verified_user
if verified_user = User.find_by(id: cookies.signed[:user_id])
verified_user
else
reject_unauthorized_connection
end
end
end
end
答案 0 :(得分:6)
Ya有点必须推出自己的用户跟踪。
重要部分如下:
# connection
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :uid
def connect
self.uid = get_connecting_uid
logger.add_tags 'ActionCable', uid
end
protected
# the connection URL to this actioncable/channel must be
# domain.tld?uid=the_uid
def get_connecting_uid
# this is just how I get the user id, you can keep using cookies,
# but because this key gets used for redis, I'd
# identify_by the user_id instead of the current_user object
request.params[:uid]
end
end
end
# Your Channel
def subscribed
stop_all_streams
stream_from broadcasting_name
ConnectedList.add(uid)
end
def unsubscribed
ConnectedList.remove(uid)
end
然后在模特:
class ConnectedList
REDIS_KEY = 'connected_nodes'
def self.redis
@redis ||= ::Redis.new(url: ActionCableConfig[:url])
end
# I think this is the method you want.
def self.all
redis.smembers(REDIS_KEY)
end
def self.clear_all
redis.del(REDIS_KEY)
end
def self.add(uid)
redis.sadd(REDIS_KEY, uid)
end
def self.include?(uid)
redis.sismember(REDIS_KEY, uid)
end
def self.remove(uid)
redis.srem(REDIS_KEY, uid)
end
end