Authlogic gem/plugin with Ruby on Rails 3

Authlogic is useful to create authentication for our Ruby on Rails application. Here are few steps to implement in Ruby on Rails 3.0 application,

Create new Rails application with Rails 3.0 as created in previous post,

rails new commentsApp -d mysql

1) To implement Authlogic in Ruby on Rails 3.0 application, include following gem in your Gemfile,

gem "authlogic"

gem "rails3-generators"

so your Gemfile will look like,

source 'http://rubygems.org'

gem 'rails', '3.0.3'

gem 'mysql2'

gem "authlogic"

gem "rails3-generators"

Run following command to install above gems,

bundle install

 

2) Create UserSession with following command,

 

rails g authlogic:session UserSession

After creating this UserSession Authlogic model, make it look like following,

class UserSession < Authlogic::Session::Base

  def to_key

    new_record? ? nil : [ self.send(self.class.primary_key) ]

  end

end

3) Create User model as,

rails g model User

 

4) To add fields for users table, open respective migrations

 

from /db/migrate folder, and make it look like following,

 

 

 

class CreateUsers < ActiveRecord::Migration

  def self.up

    create_table :users do |t|

      t.string    :login,               :null => false

      t.string    :email,               :null => false

      t.string    :crypted_password,    :null => false

      t.string    :password_salt,       :null => false

      t.string    :persistence_token,   :null => false

      t.string    :single_access_token, :null => false                # optional, see Authlogic::Session::Params

      t.string    :perishable_token,    :null => false                # optional, see Authlogic::Session::Perishability

      # magic fields (all optional, see Authlogic::Session::MagicColumns)

      t.integer   :login_count,         :null => false, :default => 0

      t.integer   :failed_login_count,  :null => false, :default => 0

      t.datetime  :last_request_at

      t.datetime  :current_login_at

      t.datetime  :last_login_at

      t.string    :current_login_ip

      t.string    :last_login_ip

      t.timestamps

    end

add_index :users, ["login"], :name => "index_users_on_login", :unique => true

add_index :users, ["email"], :name => "index_users_on_email", :unique => true

add_index :users, ["persistence_token"], :name => "index_users_on_persistence_token", :unique => true

end

def self.down

drop_table :users

end

end

 

5) Add ‘acts_as_authentic’ in User model so that it will look like,

 

class User < ActiveRecord::Base
  acts_as_authentic
end

 

6) Write following code in your ApplicationController,

 

 

 

class ApplicationController < ActionController::Base

  protect_from_forgery

  helper_method :current_user_session, :current_user

  private

    def current_user_session

      logger.debug "ApplicationController::current_user_session"

      return @current_user_session if defined?(@current_user_session)

      @current_user_session = UserSession.find

    end

    def current_user

      logger.debug "ApplicationController::current_user"

      return @current_user if defined?(@current_user)

      @current_user = current_user_session && current_user_session.user

    end

    def require_user

      logger.debug "ApplicationController::require_user"

      unless current_user

        store_location

        flash[:notice] = "You must be logged in to access this page"

        redirect_to new_user_session_url

        return false

      end

    end

    def require_no_user

      logger.debug "ApplicationController::require_no_user"

      if current_user

        store_location

        flash[:notice] = "You must be logged out to access this page"

        redirect_to account_url

        return false

      end

    end

    def store_location

      session[:return_to] = request.request_uri

    end

    def redirect_back_or_default(default)

      redirect_to(session[:return_to] || default)

      session[:return_to] = nil

    end

end

7) Create UserSessions controller with following command,

rails g controller UserSessions new

 

8) Add following code to UserSessionsController file,

 

class UserSessionsController < ApplicationController

  before_filter :require_no_user, :o nly => [:new, :create]

  before_filter :require_user, :o nly => :destroy

  def new

    @user_session = UserSession.new

  end

  def create

    @user_session = UserSession.new(params[:user_session])

    if @user_session.save

      flash[:notice] = "Login successful!"

      redirect_back_or_default account_url

    else

      render :action => :new

    end

  end

  def destroy

    current_user_session.destroy

    flash[:notice] = "Logout successful!"

    redirect_back_or_default new_user_session_url

  end

end

9) Add following in /app/views/user_sessions/new.html.erb,

<%= form_for @user_session, :url => user_sessions_path do |f| %>

<%= f.error_messages %>

 

Enter your e-mail and password to sign in.

<%= f.label :login %>

<%= f.text_field :login %>

<%= f.label :password %>

<%= f.password_field :password %>

<%= f.submit "SIGN IN" %>

<% end %>

 

10) f.error_message is removed from Rails 3, so to display error messages properly, install plugin as following,

 

rails plugin install git://github.com/rails/dynamic_form.git

11) In /config/routes.rb file, add following,

resources :user_sessions

match 'login' => "user_sessions#new", :as => :login

match 'logout' => "user_sessions#destroy", :as => :logout

 

12) Generate User Controller,

 

rails g controller users

13) Add routes for user controller in /config/routes.rb file,

  resource :account, :controller => "users"

  resources :users

 

14) Add following code in UsersController file,

 

class UsersController < ApplicationController

  before_filter :require_no_user, :o nly => [:new, :create]

  before_filter :require_user, :o nly => [:show, :edit, :update]

  def new

    @user = User.new

  end

  def create

    @user = User.new(params[:user])

    if @user.save

      flash[:notice] = "Account registered!"

      redirect_back_or_default account_url

    else

      render :action => :new

    end

  end

  def show

    @user = @current_user

  end

  def edit

    @user = @current_user

  end

  def update

    @user = @current_user # makes our views "cleaner" and more consistent

    if @user.update_attributes(params[:user])

      flash[:notice] = "Account updated!"

      redirect_to account_url

    else

      render :action => :edit

    end

  end

end

15) You need to create view files for Users,

Create /app/views/users/new.html.erb with following code,

Register

<% form_for @user, :url => account_path do |f| %>
<%= f.error_messages %>
<%= render :partial => "form", :o bject => f %>
<%= f.submit "Register" %>
<% end %>

 

Create /app/views/users/_form.html.erb with following code,

 

<%= form.label :login %>

<%= form.text_field :login %>

<%= form.label :email %>

<%= form.text_field :email %>

<%= form.label :password, form.object.new_record? ? nil : "Change password" %>

<%= form.password_field :password %>

<%= form.label :password_confirmation %>

<%= form.password_field :password_confirmation %>

Create /app/views/users/edit.html.erb with following code,


 

Edit My Account

<% form_for @user, :url => account_path do |f| %>

  <%= f.error_messages %>

  <%= render :partial => "form", :o bject => f %>

  <%= f.submit "Update" %>

<% end %>

<%= link_to "My Profile", account_path %>

 

Create /app/views/users/show.html.erb with following code,

 

Login: <%=h @user.login %>

Login count: <%=h @user.login_count %>

Last request at: <%=h @user.last_request_at %>

Last login at: <%=h @user.last_login_at %>

Current login at: <%=h @user.current_login_at %>

Last login ip: <%=h @user.last_login_ip %>

Current login ip: <%=h @user.current_login_ip %>

<%= link_to 'Edit', edit_account_path %> |

<%= link_to 'Logout', :logout %

16) Run migration to create “users” table,

rake db:create

rake db:migrate

17) Now start rails server with following command,

rails s

18) Access application in browser as,

http://localhost:3000/users/new

New user can register from this registration page. After registration, user will be taken to Account page. Once logout, you will be taken to Login page.

19) To login, open following page,

http://localhost:3000/user_sessions/new

From above page, user can login to own account.

This entry was posted in My Voice, Technology and tagged . Bookmark the permalink.

2 Responses to Authlogic gem/plugin with Ruby on Rails 3

  1. Rio says:

    This was incredibly useful. Thanks!

  2. Zeenat says:

    after login how to authenticate user by mail in above code
    and how an admin can login from the same user login without any other page

Leave a Reply

Your email address will not be published. Required fields are marked *

*


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>