Ở 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:
- Cài đặt Ruby on Rails version 5 trên máy chủ Ubuntu 16.04
- CSDL MySQL database version 5.7
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.
Nguồn: vinasupport.com