今回は、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、テストコードを活用する
ぜひこれらを活用して、アプリケーションにお役立てください
コメント