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.
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 <strong><%= current_user.email %></strong>.
<%= 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.
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"
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/
.
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.
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]
Verificar se o usuário está logado:
user_signed_in?
Objeto com o atual usuário logado:
current_user
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