Attention ! Billet en cours de rédaction.

Beaucoup essayent des plugins différents pour gérer le système de login de leur application Rails. Nou allons voir ici comment en créer un rapidement sans avoir à recourir à l’un de ces plugins.

Vous allez voir c’est assez simple :

Création du model User

Il suffit de lancer tout simplement la commande :

$ ./script/generate model User

Création du controller Account

Ensuite, nous allons créer le contrôleur Account qui va gérer le système de login de notre application. Tapez la commande suivante :

$ ./script/generate controller Account login signup

Modification du contrôleur

Voilà à quoi ressemble le fichier :

1
2
3
4
5
6
7
class Account < ApplicationController
  def login
  end

  def signup
  end
end

Il faut le modifier comme celà :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Account < ApplicationController
  def login
    return unless request.post?
    # authenticate est une métode qu'on implémentera, ensuite, dans le Model 'User'
    @user = User.authenticate(params[:email], params[:password]) model
    if @user.nil?
      session[:user] = @user.id
      redirect_to :controller => "admin/general", :action => "config"
    end
  end

  def signup
    return unless request.post?
    @user = User.new(params[:user])
    if @user.save
      redirect_to :controller => "admin/general", :action => "config"
    else
      flash[:notice] = "Error"
      redirect_to  :action => "login"
    end
  end
end

Modification du Model

Nous allons, maintenant, modifier le modèle pour lui ajouter la méthode d’authentification authenticate et la méthode pour crypter le mot de passe encrypt.

Voilà à quoi ressemble le source :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
require 'digest/md5'
class User < ActiveRecord::base
  before_save :encrypt_password
  validates_presence_of :email, :password
  validates_uniqueness_of :email, :password

  def encrypt_password
    self.password = encrypt(self.password)
  end

  def authenticate(email, password)
    find_by_email_and_password(email, encrypt(password))
  end

  def encrypt(password)
    self.class.encrypt(password)
  end

  # Encrypte le mot de passe
  # en créant une empreinte MD5 unique
  def self.encrypt(password)
    Digest::MD5.hexdigest(password)
  end

end