[Ruby on Rails] Lưu trữ session trên Database trong Rails 5


Ở bài viết trước, mình đã trình cách lưu session vào Redis Server trong Ruby On Rails với lý do là mặc định Rails 5 lưu session vào cookie trên trình duyệt của máy client. Điều đó mang lại rủi ro về bảo mật cũng như bạn ko thể lưu dữ liệu nhiều hơn 4kb. Do trình duyệt chỉ cho phép lưu 4kb trên cookie mà thôi. Ở bài viết này, mình tiếp tục trình thêm một phương pháp lưu trữ session nữa đó là lưu session vào database.

Tiền đề của bài viết này:

Vì Rails 5 hỗ trợ cả MySQL, PostgreSQL và SQLite nên bài viết này có thể áp dụng tương tự với PostgreSQL và SQLite.

Hướng dẫn lưu session trên database

1. Thêm gem hỗ trợ “activerecord-session_store

– Sửa file Gemfile, thêm dependency sau:

# Database session store
gem 'activerecord-session_store'

– Chạy command sau để update gem cho Rails

bundle update

Nếu update thành công thì ta sẽ có thông tin về gem như bên dưới:

2. Tạo bảng lưu trữ session trong CSDL

– Sử dụng command sau để generate ra các file dùng để migrate tạo bảng session.

rails generate active_record:session_migration

Nó sẽ tạo ra 1 file lưu trong thư mục db/migrate/ của ứng dụng Rails, chứa các thông tin để tạo bảng session. VDdb/migrate/20180708074828_add_sessions_table.rb

– Nếu chạy lệnh migrate để tạo bảng session ngay lúc này thì có thể gây ra lỗi sau:

StandardError: An error has occurred, all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

class AddSessionsTable < ActiveRecord::Migration[4.2]

Để khắc phục lỗi này các bạn sửa file xxx_add_sessions_table.rb vừa tạo ra, thêm version [5.2] như sau:

class AddSessionsTable < ActiveRecord::Migration[5.2]
  def change
    create_table :sessions do |t|
      t.string :session_id, :null => false
      t.text :data
      t.timestamps
    end

    add_index :sessions, :session_id, :unique => true
    add_index :sessions, :updated_at
  end
end

Sau đó chạy command để tiến hành tạo bảng session

rake db:migrate

Nó sẽ tạo ra bảng session có cấu trúc như sau:

3. Cấu hình Rails 5 sử dụng database (ActiveRecord) để lưu trữ session

Thêm file config/initializers/session_store.rb có nội dung như sau:

Rails.application.config.session_store :active_record_store, :key => '_my_app'

Vậy là bạn đã thành công trong việc tổ chức lưu session vào trong database rồi.

Nguồn: vinasupport.com

             
SHARE

Bài viết liên quan

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web