【Rails】パスワード(半角英数混合必須)のバリデーションの記述を解説【最新】

Rails
この記事は約5分で読めます。

今回は、railsを使ったwebアプリケーションにおいて頻出の正規表現

パスワードを保存する際に、「半角のアルファベットと半角数字が必ず1つは含まれていなければならない」といったバリデーションを設定する方法について解説します。

最近の殆どのウェブアプリでは、パスワードは英数混合で入力することが普通になっています。アプリの安全性を高めるためにも、ぜひこちらの記述を使用しましょう!

結論

以下の記述をUserモデルに追加することで、「パスワードは英数混合でなければ保存できない」といったバリデーションを設定することができます。

VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
validates :password, format: { with: VALID_PASSWORD_REGEX, message: 'は半角英数を両方含む必要があります’}

記述の解説

では記述を解説します。

まず1行目では、「英数混合でなければならない」という正規表現を VALID_PASSWORD_REGEX という変数に代入しています。

続く2行目で、バリデーションを設定しています。

バリデーションでは次のように記述することで、送られてきた値が正規表現をクリアしているかを確認します。

validates :カラム名, format: { with: 正規表現 , message ‘エラーメッセージ’}

withオプションの正規表現の場所に、正規表現が代入された変数を渡しています。

ちなみに上のコードは、validates_format_ofを使って書くこともできます。

validates_format_of :password, with:  VALID_PASSWORD_REGEX, message: 'は半角英数を両方含む必要があります'

正しく設定できたか、チェックみましょう

正規表現及びバリデーションが正しく設定できたかを確かめるためには、以下の2つが役に立ちます。

正規表現チェッカー

Rubularという、入力した正規表現の実際の挙動を確認できるサイトがあります。

使い方は簡単で、まずyour regular expression: という欄に正規表現を入力します。

(正規表現の頭とお尻の「  / 」は両方とも不要です)

次に、your test string にテストしたい文字を入力します。

正規表現にマッチする文字が入力されたときはMacthResult欄にそのまま出力されます。

もし正規表現に引っかかる文字が入力された場合は、No matchesと出力されます。

これを使用して狙った挙動になるかを確認し、正規表現が正しく設定されているかを確認しましょう!

テストコード

もう一つの方法は、テストコードで確かめる方法です。

FactoryBot.define do
  factory :user do
    email                   { Faker::Internet.email}
    password                { 'abcd1234' }
    password_confirmation   { password }
  end
end

上記のような形で、テスト用のデータを用意します。

その後テストコードを実行し、バリデーションの設定がうまく行っているかをチェックしましょう。

describe 'ユーザー新規登録' do
    context '正常に登録できる時' do
      it 'パスワードが半角英数混合であれば登録できる' do
        expect(@user).to be_valid
      end
    end

    context '登録ができない時' do
      it 'パスワードが英語のみでは登録できない' do
        @user.password = 'abcdef'
        @user.valid?
        expect(@user.errors.full_messages).to include('は半角英数を両方含む必要があります')
      end
      it 'パスワードが数字のみでは登録できない' do
        @user.password = '123456'
        @user.valid?
        expect(@user.errors.full_messages).to include('は半角英数を両方含む必要があります')
      end
    end
  end

パスワードが半角英数混合であれば登録できる。また、パスワードが英語のみ・数字のみのでは登録できない。これらが確認できれば、バリデーションがうまく設定できています。

このようにテストコードを実行することで、要件通りの実装ができているかを確認できます。

この記事のまとめ

・英数混合必須のバリデーションを設定するためには、

VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
validates :password, format: { with: VALID_PASSWORD_REGEX, message: 'は半角英数を両方含む必要があります’}

という記述をUserモデルに設定する。

・正規表現のチェックにはRublar、テストコードを活用する

ぜひこれらを活用して、アプリケーションにお役立てください

コメント

タイトルとURLをコピーしました