Ruby Ruby on Rails Web開発 プログラミング

Rails 8 + Devise|emailを使わず login_id でログイン機能を実装する方法(SaaS対応)

Railsアプリにログイン機能を実装する場合、
最も定番なのが Devise です。

通常Deviseは

email + password

でログインします。

しかし業務システムやSaaSでは

login_id + password

でログインするケースが多くあります。

この記事では

Rails 8
Devise
login_id認証
Company / Workspace構造

という SaaS向け構成でログイン機能を実装する手順をまとめます。

この記事を書いてる人

082p
082p

ご訪問、ありがとうございます!

システムエンジニア兼動画クリエーターとして活動しています。
主に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認証の方が運用しやすいケースも多いため
覚えておくと便利です。

-Ruby, Ruby on Rails, Web開発, プログラミング