29-06-2011, 07:17 PM
J'utilisais Authlogic jusque là. Maintenant j'utilise les mécanismes de Rails 3.1. Où tout se joue dans 3 fichiers.
Mon contrôleur principal (dont héritent les autres). Je trouve l'utilisateur courant par son persistence_token.
Lors que l'utilisateur se connecte, via le contrôleur sessions :
Et dans le modèle User…
Et voilà, c'est simple et efficace ! Rails se charge de la moulinette du mot de passe via Bcrypt.
Mon contrôleur principal (dont héritent les autres). Je trouve l'utilisateur courant par son persistence_token.
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
private
def persistence_token
cookies[:persistence_token]
end
def current_user
@current_user ||= persistence_token && User.find_by_persistence_token(persistence_token)
end
end
Lors que l'utilisateur se connecte, via le contrôleur sessions :
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
@user = User.authenticate(params[:email], params[:password])
if @user
cookies.permanent[:persistence_token] = @user.persistence_token
redirect_to root_path
else
render :new
end
end
def destroy
cookies[:persistence_token] = nil
redirect_to root_path
end
end
Et dans le modèle User…
# app/models/user.rb
class User < ActiveRecord::Base
has_secure_password
before_save :generate_persistence_token, :if => :password_changed?
def self.authenticate(email, password)
user = find_by_email(email)
user && user.authenticate(password)
end
def generate_persistence_token
self.persistence_token = ActiveSupport::SecureRandom.hex(32)
end
end
Et voilà, c'est simple et efficace ! Rails se charge de la moulinette du mot de passe via Bcrypt.