Created
January 9, 2013 12:21
-
-
Save aalvesjr/4492731 to your computer and use it in GitHub Desktop.
Implementando Login com Rails
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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