# Devise O **devise** é um plugin que adiciona a funcionalidade de login para um projeto. Ele resolve todos os aspectos de **autenticação de usuários**, como login, logout, cadastro de novos usuários e recuperação de senhas. #### Instalação Primeiro adicione a linha no ```Gemfile```: gem 'devise' Depois rode o comando ```$ bundle install``` para instalar o **gem**. Inicie o devise no projeto: ```$ rails g devise:install``` Esse comando instala o **devise** no projeto e mostra algumas instruções para faze-lo funcionar. Adicione a seguinte linha no arquivo ```config/environments/development.rb``` para configurar o sistema de email: # and don't forget the other environments config.action_mailer.default_url_options = { :host => 'localhost:3000' } Depois é necessario criar um modelo para os usuários: ```$ rails generate devise user``` Note que se já existe um modelo ```user```, o devise vai apenas adicionar a funcionalidade ao modelo existente. Execute depois o comando ```$ rake db:migrate``` para executar a migração. Agora é necessario adicionar no **View** links para poder fazer o login e o logout. Adicione o seguinte codigo no arquivo ```layouts/application.html.erb```. <% if user_signed_in? %> Logged in as <%= current_user.email %>. <%= link_to 'Edit profile', edit_user_registration_path %> | <%= link_to "Logout", destroy_user_session_path, method: :delete %> <% else %> <%= link_to "Sign up", new_user_registration_path %> | <%= link_to "Login", new_user_session_path %> <% end %> Com isso é possivel ter um sistema de autenticação de usuarios basico, funcional em apenas alguns passos simples. #### Rotas Para mudar as rotas das páginas de sign_in e sign_out, crie uma rota no arquivo ```config/routes.rb```. devise_for :users, path_names: {sign_in: "login", sign_out: "logout"} É necessario ter uma rota **root** para que o devise funcione direito. root :to => "home#index" #### Mudando o layout do devise Por *default*, o devise esconde os arquivos do **view**. Rode o comando para gera-los no projeto: ```$ rails g devise:views``` Esse comando irá gerar os varios arquivos que compõe o **view** na pasta ```app/views/devise/```. #### Mudando os parametros de login Para utilizar outros paramentros como por exemplo usar o **username** em vez do **email**, é necessario criar uma variavel no banco de dados e alterar algumas variavéis de configuração. Primeiro rode o comando: ```$ rails g migration add_username_to_users username``` Depois no arquivo ```config/initializers/devise.rb``` modifique as variaveis: config.authentication_keys = [ :username ] config.case_insensitive_keys = [ :username ] config.strip_whitespace_keys = [ :username ] No arquivo do modelo ```app/models/user.rb```, adicione o ```attr_accessible :username``` e valide as presença dos dados por que o **devise** não valida atributos customizados: ```validates_presence_of :attribute, :on => :create, :message => "can't be blank"``` Além disso vai ser necessario mudar os parametros utilizados no **View**. #### Restringindo acesso Para limitar o acesso a certas páginas a apenas usuários loggados, adicione a seguinte linha no controlador que controla as páginas desejadas (ex: ```app/controllers/posts_controller.rb```). before_filter :authenticate_user!, except: [:index, :show] #### Helpers Verificar se o usuário está logado: user_signed_in? Objeto com o atual usuário logado: current_user #### Custom Layouts Para definir um layout diferente do que o padrão para a classe do **devise**, modifique o arquivo ```app/controllers/appication_controller.rb``` adicionando uma função para determinar o layout a ser usado: class ApplicationController < ActionController::Base layout :layout_by_resource protected def layout_by_resource if devise_controller? "layout_name_for_devise" else "application" end end end #### Links - [Devise (GitHub)](https://github.com/plataformatec/devise/) - [RailsCats - Devise(revised)](https://github.com/plataformatec/devise/) --- voltar