28-01-2012, 10:11 PM
(28-01-2012, 08:25 PM)niahoo a écrit : Peux-tu en dire plus sur ce que tu appelles une « cookie permanent et signé » ?
Si tu n'utilises pas de session, tu ne retiens rien sur l'utilisateur connecté au sein de ton application, tu stockes l'information dans une DB en RAM ? (redis ou autre ...)
Je retiens l'utilisateur connecté grâce au cookie qu'il a. Je ne stock pas du tout d'état côté serveur : ni dans un fichier, ni dans une base, ni en RAM, rien.
Le cookie n'expire jamais et son contenu est chiffré : l'application le déchiffre à la volée quand elle le lit. Du coup son contenu est soit illisible, soit fiable.
class SessionsController < ApplicationController
def create
user = User.find_by_email(params[:email])
if user.authenticate(params[:password])
# On écrit le cookie permanent en le signant.
cookies.permanent.signed[:persistence_token] = user.persistence_token
redirect_to dashboard_url
else
redirect_to root_url, error: t("users.sign_in_failed")
end
end
def destroy
cookies.delete(:persistence_token)
redirect_to root_url, notice: t("users.signed_out")
end
end
class ApplicationController
def persistence_token
# On accède au cookie déchiffré (cookies[:persistence_token] aurait retourné le cookie chiffré).
cookies.signed[:persistence_token]
end
def current_user
@current_user ||= persistence_token && User.find_by_persistence_token(persistence_token)
end
end