I – Introdução
- Neste post vamos mostrar como implementar a autenticação básica num app web usando a gem Devise com o Rails versão 3.2.1.
- Da autoria da Plataforma Tecnologia, a gem Devise é uma solução flexível para criar aplicações web com o recurso de autenticação.
- Além de permitir que usuários do app web realizem as operações de “sign in” e “sign up”, oferece recursos que são comuns para app que necessitam de gerenciamento de usuários.
- Neste artigo vamos continuar a construir um app web, que iniciamos anteriormente.
- O código fonte gerado neste artigo, está hospedado no Github em https://github.com/sergiosouzalima/service_desk
II – Principais tecnologias usadas neste artigo
- Linux Ubuntu 11.10
- Ruby 1.9.2
- Rails 3.2.1
- gem Devise 2.0
III – O que não precisamos instalar
- Git, RVM, openssl, sqlite3 e outros pacotes necessários.
- Como dependemos de instalações e configurações anteriores, caso seu ambiente não esteja preparado, veja os posts:
- Para instalar a versão do Rails 3.2.1, siga o tutorial acima (item 1 e 2). Apenas informe a versão do Rails 3.2.1 no lugar das versões anteriores.
IV – O que precisa ser feito antes
- Este post é continuação do trabalho que fizemos em: Aplicação “mestre detalhe” em Rails 3.2.1
V – Sequência de passos para utilização
Passo 01 – Entre na aplicação que criamos anteriormente
$ cd service_desk
Passo 02 – Gemfile: adicione as gems necessárias
- Ajuste seu arquivo Gemfile para que fique assim:
gem 'devise', '2.0.0'
Passo 03 – Execute o bundle
$ bundle install
Passo 04 – Crie uma nova página inicial para este app
$ rails g controller Pages index $ rm public/index.html
Passo 05 – Acrescente a autenticação pelo Devise
$ rails g devise:install $ rails g devise user
- Estes comandos vão gerar os seguintes arquivos:
- config/initializers/devise.rb
- config/locales/devise.en.yml
- db/migrate/………….._devise_create_users.rb
- app/models/user.rb
- e dentro do arquivo “route”: devise_for :users
- Ajuste o arquivo app/mode/user.rb para que fique da seguinte maneira:
class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :token_authenticatable, :confirmable, :lockable, :timeoutable # Setup accessible (or protected) attributes for your model attr_accessible :email, :password, :password_confirmation, :remember_me, :confirmed_at end
- Copie e cole a migration gerada para User. Está em db/migrate/……._devise_create_users.rb:
class DeviseCreateUsers < ActiveRecord::Migration def change create_table(:users) do |t| ## Database authenticatable t.string :email, :null => false, :default => "" t.string :encrypted_password, :null => false, :default => "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable t.integer :sign_in_count, :default => 0 t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :current_sign_in_ip t.string :last_sign_in_ip ## Encryptable t.string :password_salt ## Confirmable t.string :confirmation_token t.datetime :confirmed_at t.datetime :confirmation_sent_at t.string :unconfirmed_email # Only if using reconfirmable ## Lockable t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts t.string :unlock_token # Only if unlock strategy is :email or :both t.datetime :locked_at ## Token authenticatable t.string :authentication_token t.timestamps end add_index :users, :email, :unique => true add_index :users, :reset_password_token, :unique => true add_index :users, :confirmation_token, :unique => true add_index :users, :unlock_token, :unique => true add_index :users, :authentication_token, :unique => true end
- O comando abaixo irá executar a migração de dados (migration) e criar a tabela de usuários:
$ bundle exec rake db:migrate
- Repare que na resposta do comando de migração de dados, foi criada automaticamente uma chave única (:unique=>true) para evitar a repetição do email do usuário.
== DeviseCreateUsers: migrating ============================================== -- create_table(:users) -> 0.0469s -- add_index(:users, :email, {:unique=>true}) -> 0.0012s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0011s == DeviseCreateUsers: migrated (0.0593s) =====================================
- Agora crie uma verificação para que a página inicial do app, nos direcione para a página de login se o usuário não estiver logado.
- No arquivo app/controllers/pages_controller.rb, inclua a linha “before_filter :authenticate_user!”
class PagesController < ApplicationController before_filter :authenticate_user! def index end end
- No arquivo config/environments/development.rb, acrecente as seguintes linhas
config.action_mailer.default_url_options = { :host => 'localhost:3000' } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :enable_starttls_auto => true, :address => 'smtp.gmail.com', :port => '587', :authentication => :plain, :domain => 'gmail.com', :user_name => 'joao_da_silva', :password => '123456' }
Passo 06 – Ajuste o layout
- Certifique-se que seu arquivo app/views/layouts/application.html.rb, esteja igual ao seguinte
<!DOCTYPE html> <html> <head> <title>Service Desk</title> <%= stylesheet_link_tag "application", :media => "all" %> <%= javascript_include_tag "application" %> <%= csrf_meta_tags %> </head> <body> <header> <h1>Service Desk | Tickets Controller</h1> </header> <nav> <% if user_signed_in? %> Signed in as <%= current_user.email %> <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> <% else %> <%= link_to "Sign up", new_user_registration_path %> <%= link_to "Sign in", new_user_session_path %> <% end %> </nav> <section id="main"> <div class="flash"> <% flash.each do |type, message| -%> <div class="message <%= type %>"> <p><%= message %></p> </div> <% end -%> </div> <%= yield %> </section> <footer> <sub>Service Desk | Ticket Controller Web Application</sub> </footer> </body> </html>
Passo 07 – Ajuste a página principal
- Certifique-se que seu arquivo app/views/pages/index.html.rb, esteja igual ao seguinte
<h1>Home</h1> <%= link_to 'Tickets', tickets_path %>
Passo 08 – Adicione um desvio da página dos tickets para a página principal e ajuste as rotas.
- Certifique-se que seu arquivo app/views/tickets/index.html.rb, as duas últimas linhas sejam as seguintes
<%= link_to 'New Ticket', new_ticket_path %> | <%= link_to 'Home', root_path %>
- No arquivo config/routes.rb, garanta que suas rotas estejam como abaixo
resources :tickets devise_for :users root :to => "pages#index"
Passo 09 – Execute a aplicação localmente
- Execute o servidor e carregue o browser e na linha de endereços digite http://localhost:3000
$ rails server http://localhost:3000
VI – Final Feliz
Pronto!
Fizemos o básico para implementar uma autenticação simples num app web com a gem Devise usando Rails versão 3.2.1.
VII – Referências
(1) Instalação do Ruby On Rails 3.1.1 no Linux Ubuntu 11.10
(2) Ruby On Rails 3.1.3 no Linux Ubuntu 11.10: Iniciando um novo projeto – versão 2
(3) Aplicação “mestre detalhe” em Rails 3.2.1