LoginSignup
0
0

More than 3 years have passed since last update.

[devise]アカウントの新規登録の際に権限を自動的に設定する[Rails]

Last updated at Posted at 2020-05-03

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 含まれていなければ、最低限の権限を付与させる

実装

コマンドを用いて権限テーブルを作成する

cmd
rails g model Permission A_flag:boolean B_flag:boolean C_flag:boolean

基本の状態やnullを禁止するように設定する

db/migrate/[Timestamp]_create_permissions.rb
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

あらかじめ、権限テーブルの中身を作成しておく

db/seeds.rb
Permission.create([
    {:A_flag => true},
    {:B_flag => true},
    {:C_flag => true}
])

作成したマイグレーションファイルとseeds.rbを実行

cmd
rails db:migrate
rails db:seed

アソシエーションの設定(validatesは冗長かも)

app/model/permission.rb
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
app/model/user.rb
class User < ApplicationRecord
  ()
  belongs_to :permission
  ()

deviseで生成したregistrations_controller.rbに対して追記した

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による認証

0
0
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
0
0