Skip to content

Instantly share code, notes, and snippets.

@aalvesjr
Created January 9, 2013 12:21
Show Gist options
  • Select an option

  • Save aalvesjr/4492731 to your computer and use it in GitHub Desktop.

Select an option

Save aalvesjr/4492731 to your computer and use it in GitHub Desktop.
Implementando Login com Rails
# O que um login deve fazer? proteger o acesso a dados restritos, paginas restritas talves?
# E como fazer isso no rails, podemos usar no controller que você quer restringir o acesso um before_filter, por exemplo:
before_filter :require_logged_user
# Assim antes de cada requisição ele vai executar o :require_logged_user, e esse metodo verifica se o usuário esta logado
# vamos a implementação:
# vou criar esse metodo dentro do ApplicationController ja que todos os outros controllers vão herdar dele
# lembrando que dentro de controller os métodos são privados
# para não serem usados como rotas
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
private
def require_logged_user
return if logged_in?
redirect_to login_path, :notice => "É necessario estar logado para acessar"
end
end
# Primeiro ele verifica se existe um usuário logado com logged_in?,
# se existir ele sai do método (return), caso não exista, redireciona para o path de login
# como implementar o método logged_in?
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
# todos os metodos daqui em diante serão privados
private
def logged_in?
current_user.present? # se esta presente, se tem valor
end
# current_user vai ser o usuario de acordo com o :user_id armazenado em sessão
def current_user
@current_user ||= session[:user_id] && User.find_by_id(session[:user_id])
end
def require_logged_user
return if logged_in?
redirect_to login_path, :notice => "É necessario estar logado para acessar"
end
end
# E como seria o login_path, uma tela com um input para o login do usuario, a senha e um botão para submeter os dados,
# com o rails poderiamos fazer um controller chamado Sessions e essa pagina seria a new
class SessionsController < ApplicationController
def new
end
end
# O submit enviaria para o create desse controller
class SessionsController < ApplicationController
def create
reset_session # destroi a sessão atual
user = AutenticaUsuarioUsando(params[:login], params[:password])
if user # se existir o usuario
session[:user_id] = user.id # salva o id na session (usado anteriormente lembra?)
redirect_to dashboard_path, :notice => "Logado com sucesso" # direciona para a pagina inicial de um usuário logado
else # caso nao exista o usuário exibe a mesma pagina mas com uma :notice de falha
flash.now[:notice] = "Usuário ou Senha incorretos, tente novamente."
render :new
end
end
end
# Agora falta somente uma maneira de deslogar, que também eh simples:
def destroy
reset_session # destroi a sessão atual
redirect_to login_path # direciona para o path de login
end
# No final nosso sessions_controller.rb ficara assim:
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def index
end
def create
reset_session # destroi a sessão atual
user = AutenticaUsuarioUsando(params[:login], params[:password])
if user # se existir o usuario
session[:user_id] = user.id # salva o id na session (usado anteriormente lembra?)
redirect_to dashboard_path, :notice => "Logado com sucesso" # direciona para a pagina inicial de um usuário logado
else # caso nao exista o usuário exibe a mesma pagina mas com uma :notice de falha
flash.now[:notice] = "Usuário ou Senha incorretos, tente novamente."
render :new
end
end
def destroy
reset_session # destroi a sessão atual
redirect_to login_path # direciona para o path de login
end
end
# Simples não é? precisamos só organizar esses endpoints nas rotas do rails, o que ficaria assim:
# /config/routes.rb
NomeDaSuaApp::Application.routes.draw do
controller :sessions do
get "/login", :action => :new, :as => :login
post "/login", :action => :create, :as => false
get "/logout", :action => :destroy, :as => :logout
end
end
# Agora se vc tiver um controller Posts e quiser que ele seja acessivel somente apos logar, basta acrescentar essa linha:
class PostsController < ApplicationController
before_filter :require_logged_user
def index
end
end
# e a view index só sera visivel após o usuário logar no sistema.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment