Marcio Garcia

Software Empowerment²

restful_authentication - autenticação com terceira chave

without comments

Recentemente publiquei um post com screencast a respeito de autenticação com restful_authentication, o Kadu Adu me questionou como fazer autenticação utilizando uma terceira chave como validação, por exemplo:

  • Username
  • Password
  • Filial
Andei dando uma fuçada no código do restful_authentication e encontrei como fazer isso de uma forma bem simples, talvez não a mais correta (?!?!?!) mas consegui resolver o problema do nosso amigo Kadu Adu, segue as alterações logo abaixo.


1 - Arquivo: /app/view/sessions/new.html.erb

<%= flash[:notice] %>
<% form_tag session_path do -%>
<label for="login">Login</label>
<%= text_field_tag 'login' %>
 
<label for="password">Password</label>
<%= password_field_tag 'password' %>
 
<!-- Uncomment this if you want this functionality
<label for="remember_me">Remember me:</label>
<%= check_box_tag 'remember_me' %>
-->
 
<!-- autenticacao com terceira chave.... -->
<label for="filial">Filial</label>
<%= text_field_tag 'filial' %>
<%= submit_tag 'Log in' %>
 
<% end -%>
<%= link_to "Criar usuario",  { :controller => "users", :action => "new" } %>
 -<%= link_to "Login",  { :controller => "sessions", :action => "new" } %>
 -<%= link_to "Sair", { :controller => "sessions", :action => "logout" } %>

2 - Arquivo: app/controller/sessions_controller.rb

# This controller handles the login/logout function of the site.  
class SessionsController < ApplicationController
 
  # render new.rhtml
  def new
    #alterado....................
    flash[:notice] = "Usuario logado!" if logged_in?
    flash[:notice] = "Usuario NÃO logado!" unless logged_in?
 
  end
 
  def create
 
    #autenticacao com terceira chave......
    self.current_user = User.authenticate(params[:login], params[:password], params[:filial])
    # self.current_user = User.authenticate(params[:login], params[:password])    
 
    if logged_in?
      if params[:remember_me] == "1"
        current_user.remember_me unless current_user.remember_token?
        cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
      end
      redirect_back_or_default('/')
      flash[:notice] = "Logged in successfully"
    else
      render :action => 'new'
    end
  end
 
  def logout
    self.current_user.forget_me if logged_in?
    cookies.delete :auth_token
    reset_session
    flash[:notice] = "You have been logged out."
    redirect_back_or_default('/')
  end
end

3 - Arquivo: app/model/user.rb

Coloque este método antes da definição do último método que é protected
  #autenticacao com terceira chave.....
  def self.authenticate(login, password, filial)
    u = find_by_login_and_filial(login, filial) # need to get the salt
    u && u.authenticated?(password) ? u : nil
  end

4 - Arquivo: db/migrate/01_create_user.rb

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table "users", :force => true do |t|
      t.column :login,                     :string
      t.column :email,                     :string
      t.column :crypted_password,          :string, :limit => 40
      t.column :salt,                      :string, :limit => 40
      t.column :created_at,                :datetime
      t.column :updated_at,                :datetime
      t.column :remember_token,            :string
      t.column :remember_token_expires_at, :datetime
 
      #alteracao para terceira chave....
      t.column :filial,                    :string
    end
  end
 
  def self.down
    drop_table "users"
  end
end

Altere o seu banco de dados via rake ou alter table para que a nova coluna filial seja criada e após as alterações com a aplicação no ar, voce poderá verificar que se passado apenas um usuário e senha válidos sem que a filial seja correta o sistema não autenticará o usuário.

Fiz este código bem rápido, pode ser que esta não seja a melhor solução, se alguém tiver uma melhor saída, fell free to contribute!

Enjoy!

Written by Marcio

November 10th, 2008 at 9:23 pm

Leave a Reply