To Examples

LoginRegistration Example

Directions

  1. Create a Rails project named LoginRegistration.
  2. Create a Rails model named Login:
    > rails g model Login user:string password:string
    
  3. Create Rails controllers Logins and Info:
    > rails g controller Logins new_login show_logins ⇓
        login_form registration_confirmation
    > rails g controller info page1
    
    page1 represents your website content that should be password protected.
  4. Use the following source code for the indicated files:
    ---- LoginController/app/controllers/logins_controller.rb --------------------------
    
    require 'digest/md5'
    
    class LoginsController < ApplicationController
      def new_login
      end
    
      def show_logins
      end
      
      def registration_confirmation
      	@login = Login.new
        @login.user = params[:user]
        pw_from_user = params[:pw]
        confirm_from_user = params[:confirm_pw]
        if pw_from_user != confirm_from_user
          redirect_to logins_new_login_path, 
            notice: 'Password does not match confirmation.'
          return
        end
        @login.password = Digest::MD5.hexdigest(pw_from_user)    
        if @login.save
          @msg = 'New user was successfully registered.'
          @all_logins = Login.all
        else
          if @login.errors.any?
            cnt = @login.errors.count
            error_messages = cnt.to_s + " " + "error".pluralize(cnt) + 
              " prohibited password from being created.\n"
            @login.errors.full_messages.each do |msg|
              error_messages += "--" + msg + ".\n"
            end
          end
    	  redirect_to logins_new_login_path, notice: error_messages
          return
        end 
      end
    
      def login_form  
    	 
        # User must login again when arriving at the login page,
        # even if already logged in previously.
    	reset_session
    	
        # Get username and password
        user_from_login = params[:user_from_login]
        pw_from_login = params[:pw_from_login]
    	
        # Get password from database for entered username.  
        # If password from database matches the entered password,
        # store true in session variable so user need not login again.
        if !user_from_login.blank?
          pw_array = Login.where(user: user_from_login)
          encoded_pw = Digest::MD5.hexdigest(pw_from_login)	
          if pw_array.length > 0
            pw_from_db = pw_array[0].password
            if pw_from_db == encoded_pw
              session[:logged_in] = true
              redirect_to info_page1_path
            end
          end
        end
      end
    	
      def logout
    	
        # If user logs out from any page,
        # reset session variable to false.
        reset_session
    	
        # Go back to login again.
        redirect_to logins_login_form_path
    	
      end 
    end
    
    ---- LoginController/app/views/logins/new_login.html.erb ---------------------------
    
    <h1>Login Registration</h1>
    
    <pre style="font-family: arial;">
      <%= flash[:notice] %>
    </pre>
    
    <p><%= form_tag logins_registration_confirmation_path do %>
      <table>
        <tr> 
          <td class="r">Username</td> 
          <td><%= text_field_tag :user, '' %></td>
        </tr>
        <tr> 
          <td class="r">Password</td> 
          <td><%= password_field_tag :pw, '' %></td>
        </tr>
        <tr> 
          <td class="r">Confirmation</td> 
          <td><%= password_field_tag :confirm_pw, '' %></td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td><%= submit_tag 'Register' %>
        </tr>
      </table>
    <% end %></p>
    
    ---- LoginController/app/views/logins/registration_confirmation --------------------
    
    <h2>Registration Confirmation</h2>
    
    <p>New user registration confirmed.</p>
    
    <p><%= link_to 'To Login Form', logins_login_form_path %></p>
    <p><%= link_to 'Show All Logins', logins_show_logins_path %></p>
    
    ---- LoginController/app/views/logins/login_form.html.erb --------------------------
    
    <h1>Login Form</h1>
    
    <%= form_tag logins_login_form_path do %>
      <table>
        <tr> 
          <td style="text-align:right">Username:</td> 
          <td><%= text_field_tag :user_from_login, '' %></td>
        </tr>
        <tr>
          <td style="text-align:right">Password:</td> 
          <td><%= password_field_tag :pw_from_login, '' %></td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td><%= submit_tag 'Login' %></td> 
        </tr>
      <table>
    <% end %>
    
    <p><%= link_to 'Register New User', logins_new_login_path %></p>
    
    ---- LoginController/app/views/logins/show_logins.html.erb -------------------------
    
    <h1>Current Registered Users</h1>
    
    <table>
      <tr>
        <td>User</td>
        <td>Encrypted Password</td>
      </tr>
    
      <% Login.all.each do |login| %> 
        <tr>
          <td><%= login.user %></td>
          <td><%= login.password %></td>
        </tr>
      <% end %>
    </table>
    
    <p><%= link_to 'To Login Form', logins_login_form_path %></p>
    
    ---- LoginController/app/controllers/info_controller.rb ----------------------------
    
    class InfoController < ApplicationController
      def page1
      end
    
    private
      def check_logged_in
        if !session[:logged_in]
          redirect_to logins_logins_form_path
        end
      end
    end
    
    ---- LoginController/app/views/info/page1.html.erb ---------------------------------
    
    <%= form_tag logins_logout_path, class: 'r' do %>
      <%= submit_tag 'Logout' %>
    <% end %>
    
    <h1>Info Page</h1>
    
    <p>This is the password protected page.</p>
    
    ---- LoginController/assets/stylesheets/application.css ----------------------------
    
    .r { text-align: right }
    
    ---- LoginController/config/routes.rb ----------------------------------------------
    
    Rails.application.routes.draw do
      get  'logins/new_login'
      get 'logins/registration_confirmation'
      post 'logins/registration_confirmation'
      get 'logins/login_form'
      post 'logins/login_form'
      get  'logins/show_logins'
      post 'logins/show_logins'
      get 'logins/logout'
      post 'logins/logout'
      get 'info/page1'
    end