Ruby on rails

Remember me trong Rails

I. Remember me là gì?

  • Remember me là chức năng giúp người dùng ghi nhớ tài khoản đăng nhập kể cả khi đã tắt trình duyệt.
  • Tuy nhiên việc dùng cookies để lưu password của user là quá nguy hiểm và gây ra mất bảo mật của tài khoản.
  • Vì vậy, giải pháp cho vấn đề này là sử dụng remember_token để lưu lại trạng thái đăng nhập của user và lưu lại mã hóa của remember_token trong database trong trường remember_digest.

II. Các bước thực hiện

  1. Thêm trường remember_digest vào database: Trong terminal, lần lượt chạy 2 lệnh sau để thêm trường remember_digest vào bảng users:
$ rails generate migration add_remember_digest_to_users remember_digest:string
$ bundle exec rake db:migrate
  1. Thêm hàm vào model User:
  • Sử dụng method urlsafe_base64 của module SecureRandom để sinh token (một chuỗi ký tự ngẫu nhiên):
# /app/models/users.rb
def User.new_token
    SecureRandom.urlsafe_base64
end
  • Sử dụng attr_accessor để khai báo remember_token là một asscessible attribute của model User:
# /app/models/users.rb
class User < ApplicationRecord
  attr_accessor :remember_token
  ...
end
  • Viết hàm remember để sinh token và lưu mã hóa của token vào database:
# /app/models/users.rb
def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
end
  • Thêm hàm authenticate?(remember_token) để kiểm tra token có tương ứng với digest không:
# /app/models/users.rb
def authenticated?(remember_token)
    return false if remember_digest.nil?
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
  • Ngoài ra, để hủy bỏ chức năng remember khi mong muốn, ta cũng cần thêm hàm forget để xóa remember_digest khi đăng xuất:
# /app/models/users.rb
def forget
    update_attribute(:remember_digest, nil)
end
  1. Thêm hàm cho SessionsHelper:
  • Thêm hàm remember(user) để tạo token, lưu token đã mã hóa vào database và lưu user_id, remember_token vào cookies:
# /app/helpers/sessions_helper.rb
def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
end
  • Tương tự, thêm hàm forget(user) để xóa token và cookies khi logout:
# /app/helpers/sessions_helper.rb
def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
end

def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
end
  1. Cuối cùng, sử dụng các hàm trong helpers để xử lý khi login, logout trong SessionsController:
# /app/controllers/sessions_controller.rb
def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_back_or user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
end

def destroy
    log_out if logged_in?
    redirect_to root_url
end

III. Kết luận

Trên đây là các bước cơ bản để thực hiện chức năng remember me trong một ứng dụng Rails. Hi vọng bài viết sẽ giúp các bạn có được cái nhìn tổng quan về cách để lưu lại trạng thái đăng nhập trong một ứng dụng Rails cơ bản.

Cảm ơn đã theo dõi

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration