Autenticação em Ruby On Rails 3.2.1 com Devise

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

IV – O que precisa ser feito antes

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

$ 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

Ruby On Rails 3.1.3 com a gem Nifty Generators (compatibilizando)

I – Introdução

Neste post vamos mostrar como usar a gem Nifty Generators com o Rails versão 3.1.x.

Da autoria de Ryan Bates, a gem Nifty Generators, cria, entre outras coisas, um scaffold estilizado, muito útil para servir como base para uma aplicação.

Compatibilidade
A gem Nifty Generators ainda não está compatível com o Rails versão 3.1.x, então faremos alguns procedimentos temporários até que os dois estejam compatíveis.

II – Principais tecnologias usadas neste artigo

III – O que não precisamos instalar

IV – Sequência de passos para utilização

Passo 01 – Crie uma aplicação

$ rails new people
$ cd people

Passo 02 – Gemfile: adicione as gems necessárias

  • Ajuste seu arquivo Gemfile para que fique assim:
gem 'execjs'    # necessário para Linux
gem 'therubyracer'  # necessário para Linux

group :test do
  # Pretty printed test output
  gem 'turn', '0.8.2', :require => false
  gem "mocha"
end

group :development do
  gem "nifty-generators"
end

Passo 03 – Execute o bundle

$ bundle install

Passo 04 – Gere o layout e execute alguns comandos

$ rails generate nifty:layout
$ mv public/stylesheets/application.css app/assets/stylesheets
$ rm -r public/stylesheets/

Passo 05 – Ajuste seu arquivo de layout

Ajuste no seu arquivo app/views/layouts/application.html.erb para que fique com as linhas abaixo:

<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>

Passo 06 – Gere o scaffold com a gem Nifty Generators

$ rails generate nifty:scaffold person name:string
$ bundle exec rake db:migrate

Passo 07 – Ajuste as rotas para o controlador

No arquivo config/routes.rb adicione a linha abaixo

root :to => "people#index"

Passo 08 – Execute o servidor localmente

$ rm public/index.html
$ rails server

V – Final Feliz

Pronto!
Fizemos o básico para iniciarmos um novo projeto usando Ruby On Rails 3.1.3 no Linux Ubuntu 11.10 com adaptações temporárias, usando a gem Nifty Generators.
Quando esta gem já estiver compatibilizada com versões do Rails 3.1.x não haverá mais necessidade de usar este passo a passo.

VI – 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) http://passbyvalue.com/2011/11/getting-started-with-heroku-and-rails-3-1/