Archive for the ‘restful_authentication’ tag
restful_authentication - autenticação com terceira chave
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:
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!
- Username
- Password
- Filial
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!
Screencast - restful_authentication
restful_authentication - Screencast (pt-br) from Marcio Garcia on Vimeo.
Instalação do restful_authentication
URL do plugin:http://svn.techno-weenie.net/projects/plugins/restful_authentication/
./scrpt/plugin source http://svn.techno-weenie.net/projects/plugins/restful_authentication/ ./script/plugin install restful_authentication
Criação dos controllers e model padrão
./script/generate authenticated user sessions
Alterações de código
routes.rb#novas rotas.... map.signup '/', :controller => 'sessions', :action => 'new' map.signup '/signup', :controller => 'users', :action => 'new' map.login '/login', :controller => 'sessions', :action => 'new' map.logout '/logout', :controller => 'sessions', :action => 'destroy'
app/views/layouts/application.html.erb
<html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <%= stylesheet_link_tag 'scaffold' %> </head> <body bgcolor="#1471B7"> <center> <p> </p> <table width="90%" bgcolor="#FFFFFF"> <tr> <td align="center"> <%= yield%> </td> </tr> </table> </center> </body> </html>
app/controllers/application.rb
include AuthenticatedSystem
app/controllers/sessions_controller.rb
def new #alterado.................... flash[:notice] = "Usuario logado!" if logged_in? flash[:notice] = "Usuario NÃO logado!" unless logged_in? end
app/controllers/users_controller.rb
#alterado...................... before_filter :authentication def authentication redirect_back_or_default('/') unless logged_in? end