8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsのSoceryとactiverecord-session_storeでログイン認証を実装

Last updated at Posted at 2018-08-15

はじめに

APIの認証に最適なGemがないかな~と探していました。
どうもDeviceは大仰過ぎるのと、5系の環境下でうまく動かず四苦八苦していました。
そんなところで、SoceryとDoorkeeperに出会い、簡単に実装できました!
今度はWEBも実装する事になったので、セッション管理が必要だ~という事でSoceryとactiverecord-session_storeでログイン認証を実装する事になったのであります。

環境

  • CentOS7
  • ruby 2.4.3
  • Rails 5.2.0
  • MySQL 5.7

RoRとMySQLは導入済みの前提で話を進めます。

導入

いつもの様にGemfileを編集します。

Gemfileの編集

Gemfile
gem 'sorcery'
gem 'activerecord-session_store'

bundleインストール

コンソールからバンドル~Soceryとactiverecord-session_storeのインストール

console
bundle
rails generate sorcery:install
rails generate active_record:session_migration

migration fileの編集

Sorceryはデフォルトだとusersと言うテーブルのマイグレーションファイルになります。
しかしながら私が実装した環境では、usersはログイン認証以外の人情報を扱うテーブルとして既に存在していて、ログイン認証を同時に扱うには都合が悪かったのでsessionsというテーブルとして作成しました。
また、メールアドレスをログインIDとしない方式にしたのでlogin_idというcolumnでテーブルを作成しています。

yyyymmddxx_add_session_stores_table.rb

class CreateSessions < ActiveRecord::Migration[5.2]
  def change
    create_table :sessions do |t|
      t.string :login_id, null: false
      t.string :crypted_password, null: false
      t.string :salt, null: false
      t.timestamps
    end
  end
end

activerecord-session_storeはデフォルトだとsessionsと言うテーブルのマイグレーションファイルになります。
しかしながらこちらについても、sessionsと言うテーブルは上記のSocery実装時に既にログイン認証(ID・パスワード管理)のためのテーブルとして存在していたので、session_storesという名称に変更しました。

yyyymmddxx_add_sessions_table.rb

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

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

マイグレーションを忘れずに。

console
rails db:migrate

Soceryの設定情報

デフォルトのログイン認証テーブル(:users)から変更になったことの宣言と、テーブルの変更について記述。

config/initializers/sorcery.rb
Rails.application.config.sorcery.submodules = []
Rails.application.config.sorcery.configure do |config|
  config.user_config do |user|
    user.username_attribute_names = :login_id
    user.stretches = 1 if Rails.env.test?
  end
  config.user_class = 'Session'
end

activerecord-session_storeの設定情報

activerecord-session_storeを使用する事の宣言と、テーブル名称がデフォルト(:sessions)から変わった事を記述するファイルを作成。
セッションの有効期限を24時間に設定。

config/initializers/session_store.rb
Rails.application.config.session_store :active_record_store, :key => '_app_session', :expire_after => 24.hour
ActiveRecord::SessionStore::Session.table_name = 'session_stores'

セッション

セッションの情報はこんな感じで取り出せたり。

console
p session[:login_id]

こんな感じにインポートできたりします。

controller
session[:form_data] = params[:form_data]
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?