Giới thiệu Gem Devise

1.Giới thiệu

Hôm nay mình xin giới thiệu tới các bạn 1 gem trong Ruby on Rails mà được rất nhiều lập trình viên sử dụng.đó chính là Gem Devise

Devise là một gem rất linh hoạt được sử trong quá trình xác thực người dùng.Nó hỗ trợ hầu hết tất cả mọi việc bạn cần trong việc quản lí và xác thực người dùng trong hệ thống của bạn.Nó cho phép bạn có thể tạo nhiều Model trong cùng một lúc;Nó dược xây dựng dựa trên các module nên bạn có thể chỉ sử dụng những gì bạn thực sự cần.Gem devise có 10 module chính sau:

Tên module Chức năng chính
Database Authenticatable encrypts và lưu trữ mật khẩu trong cơ sở dữ liệu để xác nhận tính xác thực của một người sử dụng.Việc xác thực có thể được thực hiện thông qua POST hoặc HTTP Basic Authentication..
Omniauthable thêm OmniAuth (https://github.com/intridea/omniauth) hỗ trợ
Confirmable gửi email hướng dẫn xác nhận và xác minh một tài khoản đã đăng kí đúng với email.
Recoverable reset mật khẩu người dùng và gửi hướng dẫn đặt lại.
Registerable xử lý việc đăng ký người sử dụng thông qua một quá trình đăng ký, cũng cho phép họ để chỉnh sửa và phá hủy tài khoản của họ.
Rememberable quản lý tạo ra một mã thông báo cho người sử dụng ghi nhớ từ một cookie được lưu.
Trackable Đếm số lần đăng nhập,thời gian và địa chỉ IP của từng lần đăng nhập đó.
Timeoutable một khoảng thời gian nhất định mà người dùng chưa đăng nhập lại.
Validatable Xét tính hợp lệ của email và mật khẩu
Lockable khóa tài khoản sau khi một số quy định nhất đinh của việc đăng nhập thất bại.Có thể mở khóa thông qua email hoặc sau một thời gian xác định.

2.Cài đặt

Tạo một project mới trong cửa sổ console

rails new demo_devise

Thêm gem devise vào Gemfile

gem 'devise'

gõ các lệnh sau trong màn hình console

bundle install
rails generate devise:install

Sau khi add gem devise vào bước tiếp theo cần generate model sử dụng dem devise cho hệ thống.Ví dụ bạn muốn quản lí người dùng trong bảng User gõ lệnh sau.

rails generate devise User

màn hình console sẽ hiện.

  invoke  active_record
  create    db/migrate/20151228154229_devise_create_users.rb
  create    app/models/user.rb
  invoke    test_unit
  create      test/models/user_test.rb
  create      test/fixtures/users.yml
  insert    app/models/user.rb
   route  devise_for :users

Các file được tạo ra bao gồm: db/migrate/20151228154229_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, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## 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, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      t.timestamps null: false
    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
  end
end

ở đây bạn có thể thêm các trường cần thiết trong các thiết lập của bạn.sao cho phù hopwj với các module mà bạn định sử dụng.

Trong fileapp/models/user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

bạn có thể dùng các module bằng cách thêm các model để sử dụng.

Trong file routes.rb sẽ tự sinh ra resource của devise.

Rails.application.routes.draw do
  devise_for :users
end

Bạn cần migrate lại dữ liệu.bằng cách thực hiện các lệnh sau.

bundle exec rake db:create
bundle exec rake db:migrate

Tiếp theo, bạn cần phải thiết lập các tùy chọn URL mặc định cho Devise mailer. Dưới đây là một cấu hình trong file config/environments/development.rb

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

bạn gõ rake routes để kiểm tra xem các đường dẫn của devise đã được cài đặt thành công chưa?

      Prefix Verb   URI Pattern                    Controller#Action
    new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
        user_session POST   /users/sign_in(.:format)       devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
user_password POST   /users/password(.:format)      devise/passwords#create
   new_user_password GET    /users/password/new(.:format)  devise/passwords#new
  edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                     PATCH  /users/password(.:format)      devise/passwords#update
                     PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
   user_registration POST   /users(.:format)               devise/registrations#create
 new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
 edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                     PATCH  /users(.:format)               devise/registrations#update
                     PUT    /users(.:format)               devise/registrations#update
                     DELETE /users(.:format)               devise/registrations#destroy

Trợ giúp

Devise cung cấp một số trợ giúp trong view và controller.trong Controller có thể setup before_action.

before_action :authenticate_user!

một số trợ giúp khác

Trợ giúp Ý nghĩa,tác dụng
current_user helper này có sẵn đối với người dùng hiện tại
user_signed_in? helper này dùng để xác minh người dùng đang đăng nhập.
user_session dùng để truy cập vào phiên giao dịch

Bạn chạy lại rails server và vào trang đăng nhập. http://localhost:3000/users/sign_in login.png

Trang đăng kí http://localhost:3000/users/sign_up sign_up.png

Đến đây về cơ bản là bạn đã cài đặt xong gem devise.Ở phần tiếp theo tôi sẽ hướng dẫn bạn làm thế nào để có thể cấu hình view và controller.

Cấu hình View

Trong file config/initializers/devise.rb bạn cần cấu hình lại

config.scoped_views = true

Bạn có thể generate ra toàn bộ view cho Devise bằng cách gõ lệnh.

rails generate devise:views

hoặc bỏ bớt đi các view không cần thiết bằng các thêm -v vào sau.

rails generate devise:views -v registrations confirmations

Cấu hình Controller

  class SessionsController < Devise::SessionsController
    def new
      get_pre_login_url
      super
    end
    def create
      @referer_url = root_path
      super
    end
    def destroy
      @referer_url = root_path
      super
    end
    private
    def get_pre_login_url
      @referer_url = root_path
    end
    def after_sign_in_path_for resource
      sign_in_url = url_for(action: "new", controller: "sessions", only_path: false, protocol: "http")
      if @referer_url == sign_in_url
      super
    else
      @referer_url || root_path
    end
    end
  end

Bạn có thể viết các hàm createdestroy để redirect đến trang nào đó(ví dụ: home_page)

Kết luận

Devise là một gem khá mạnh về quản lí người dùng được sử dụng rộng rãi trong cộng đồng Ruby Developer.Cung cấp hầu hết các tính năng quản lí người dùng cho các hệ thống Rails.

Tài liệu tham khảo

https://github.com/plataformatec/devise