Pour votre information, si vous avez devise
déjà installé dans votre application, vous pouvez utiliser la variable d'environnement définie par warden
pour trouver le authenticated user
. Pour chaque utilisateur authentifié, le gardien stocke l'objet utilisateur dans l'environnement var. Chaque requête est authentifiée par le middleware warden
.
Remarque: ce env est différent de 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
Si vous ne l'avez pas utilisé devise
alors, voici une autre solution. La condition est, vous devrez définir un cookie signé appelé user_id
dans votre sessions_controller
ou quelque chose comme ça. par exemple
cookies.signed[:user_id] = current_user.id
et pour la connexion:
# 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
Connexion doit être fait en utilisant Rails façon habituelle, vous pouvez vérifier si l'utilisateur est authentifié comme expliqué ici: https://github.com/rails/ actioncable –
Je sais que je peux le faire, mais j'ai besoin que tout le site fonctionne à travers les websockets. Puis-je implémenter ceci? – asiniy