3行で分かる本記事の概要
- アカウントの新規登録の際にメールアドレスのドメイン名に応じた権限を自動的に設定した。
- permissionモデルを作成し、userモデルとアソシエーションを組んだ。
- registrations_controller.rbのcreateに処理を追加した。
動機
筆者は、現在Railsの勉強のためにWebアプリケーションを制作しています。
そのアプリケーションは学内で利用することを想定しており、学内の関係者かそれ以外かの区別をどのようにつけるか、
それらのアカウントの権限をどのように設定しようか悩んでいました。
そこで、学生及び学内関係者のメールアドレスの独自なドメイン名を利用して権限を設定したいと考えました。
環境
Ruby | 2.6.5 |
Rails | 5.2.4.2 |
devise | 4.7.1 |
方針
1 ユーザ名、メールアドレス、パスワードを入力して、アカウントを新規登録させる
2 入力させたメールアドレスの中に既定のドメイン名が含まれているかを比較する
3-A 含まれていれば、そのドメイン名に応じた権限を付与させる
3-B 含まれていなければ、最低限の権限を付与させる
実装
コマンドを用いて権限テーブルを作成する
rails g model Permission A_flag:boolean B_flag:boolean C_flag:boolean
基本の状態やnullを禁止するように設定する
class CreatePermissions < ActiveRecord::Migration[5.2]
def change
create_table :permissions do |t|
t.boolean :A_flag, default: false, null: false
t.boolean :B_flag, default: false, null: false
t.boolean :C_flag, default: false, null: false
end
end
end
あらかじめ、権限テーブルの中身を作成しておく
Permission.create([
{:A_flag => true},
{:B_flag => true},
{:C_flag => true}
])
作成したマイグレーションファイルとseeds.rbを実行
rails db:migrate
rails db:seed
アソシエーションの設定(validatesは冗長かも)
class Status < ApplicationRecord
has_many :users
validates :A_flag, inclusion: { in: [true, false] }
validates :B_flag, inclusion: { in: [true, false] }
validates :C_flag, inclusion: { in: [true, false] }
end
class User < ApplicationRecord
(略)
belongs_to :permission
(略)
deviseで生成したregistrations_controller.rbに対して追記した
class Users::RegistrationsController < Devise::RegistrationsController
(略)
# POST /resource
def create
set_permission_id
super
end
(略)
protected
(略)
def configure_sign_up_params
# permission_idをストロングパラメータに追加
devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute, :permission_id])
end
(略)
def set_permission_id
# 新規登録したアカウントのメールアドレスをemailに代入
email = params.require(:user)[:email]
# emailに@example.jpが含まれていればpermission_idを1に設定する
if email.include?("@example.jp")
params.require(:user)[:permission_id] = 1
# emailに@hogehoge.comが含まれていればpermission_idを2に設定する
elsif email.include?("@hogehoge.com")
params.require(:user)[:permission_id] = 2
# 該当するものがなければpermission_idを3に設定する
else
params.require(:user)[:permission_id] = 3
end
end
(略)
emd
最後に
今回、実装したコードはセキュリティ的に強固であるとは保証できません。参考にする際は自己責任でお願いします。
参考
note / しん / deviseのコントローラをカスタマイズしてウィザード形式の新規登録画面を作成する
github / heartcombo / devise
Qiita / @mao-0901 / superって一体なんなんだ??(Ruby on Rails)
nakamulog / deviseによる認証