-1024x576.png)
Railsアプリにログイン機能を実装する場合、
最も定番なのが Devise です。
通常Deviseは
email + password
でログインします。
しかし業務システムやSaaSでは
login_id + password
でログインするケースが多くあります。
この記事では
Rails 8
Devise
login_id認証
Company / Workspace構造
という SaaS向け構成でログイン機能を実装する手順をまとめます。
この記事を書いてる人
ご訪問、ありがとうございます!
システムエンジニア兼動画クリエーターとして活動しています。
主にRubyを得意とし、Ruby on Railsを中心にWebアプリケーション開発を行っています。
業務ではSQLやJavaScriptに触れることも多く、バックエンドからデータベースまで幅広く対応しています。
このブログでは、Ruby on RailsやPython(Django)などのWebアプリケーション開発やデータベース関連の技術記事を中心に、時々C#やWPFなどの開発内容についても発信しています。
Deviseをインストール
Gemfile
gem 'devise', '~> 5.0', '>= 5.0.2'
インストール
bundle install
Devise初期化
rails g devise:install
Userモデル作成
rails g devise user
マイグレーションを修正
emailではなく login_idで認証する設計に変更します。
class DeviseCreateUsers < ActiveRecord::Migration[8.1]
def change
create_table :users do |t| ## Login
t.string :login_id, null: false ## Database authenticatable
t.string :encrypted_password, null: false, default: "" ## Role
t.integer :role, default: 1, null: false ## Company(契約会社)
t.references :company, foreign_key: true ## Workspace(支店)
t.references :workspace, foreign_key: true ## Rememberable
t.datetime :remember_created_at t.timestamps null: false
end add_index :users, :login_id, unique: true
end
end
Devise設定変更
config/initializers/devise.rb
変更
config.authentication_keys = [:login_id]config.case_insensitive_keys = [:login_id]config.strip_whitespace_keys = [:login_id]
Userモデル修正
Deviseの validatable は email必須のため削除します。
app/models/user.rb
class User < ApplicationRecord devise :database_authenticatable,
:registerable,
:rememberable validates :login_id, presence: true, uniqueness: trueend
Devise view作成
rails g devise:views
ログイン画面修正
app/views/devise/sessions/new.html.erb
<h2>Log in</h2><%= form_with model: resource, url: session_path(resource_name), local: true do |f| %> <div class="field">
<p><%= f.label :login_id %></p>
<p><%= f.text_field :login_id %></p>
</div> <div class="field">
<p><%= f.label :password %></p>
<p><%= f.password_field :password %></p>
</div> <div class="actions">
<%= f.submit "Log in" %>
</div><% end %>
サインアップ画面修正
app/views/devise/registrations/new.html.erb
<h2>Sign up</h2><%= form_with model: resource, url: registration_path(resource_name), local: true do |f| %> <div class="field">
<p><%= f.label :login_id %></p>
<p><%= f.text_field :login_id %></p>
</div> <div class="field">
<p><%= f.label :password %></p>
<p><%= f.password_field :password %></p>
</div> <div class="field">
<p><%= f.label :password_confirmation %></p>
<p><%= f.password_field :password_confirmation %></p>
</div> <div class="actions">
<%= f.submit "Sign up" %>
</div><% end %>
ApplicationController設定
Deviseに login_id を許可します。
class ApplicationController < ActionController::Base allow_browser versions: :modern
stale_when_importmap_changes before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_in, keys: [:login_id])
endend
マイグレーション
rails db:migrate
完成
ログイン画面
http://localhost:3000/users/sign_in
サインアップ
http://localhost:3000/users/sign_up
SaaSアプリ設計
今回の構造はSaaSでよく使われる
Company(契約会社)
└ Workspace(支店)
└ User(ログインユーザー)
という構成になっています。
この設計により
- 1契約で複数支店
- 支店ごとユーザー管理
などのSaaS機能を実装できます。
まとめ
Rails 8 + Deviseでは
emailを使わず login_id認証に変更することも可能です。
主なポイントは
Devise authentication_keys変更
validatable削除
login_idフォーム変更
です。
業務システムやSaaSでは
login_id認証の方が運用しやすいケースも多いため
覚えておくと便利です。


