Trong bài viết trước, tôi đã hướng dẫn cách lưu session vào Redis Server trong Ruby On Rails. Lý do cho việc này là vì Rails phiên bản 5 mặc định lưu session vào cookie trên trình duyệt của máy khách. Tuy nhiên, việc này mang theo một số rủi ro về bảo mật, và bạn bị giới hạn về kích thước dữ liệu, không thể lưu nhiều hơn 4kb, vì trình duyệt chỉ cho phép lưu trữ tối đa 4kb trên cookie.
Trong bài viết này, tôi sẽ tiếp tục hướng dẫn một phương pháp khác để lưu trữ session, đó là lưu session vào cơ sở dữ liệu.
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. VD: db/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.