はじめに
Fakerを使ってFactoryBotを作成して、テストコード書いていました。しかし、時々すでにテストコードが通っていた場所なのに、「パスワードが不正な値です」というエラーが出てしまいました。ふと、疑問に思い、Fakerについて調べてみました。
主な内容は、Fakerが提供している、パスワードをランダムに生成する機能の英語を訳したようなものです。
Fakerとは
gemとしてインストールすることで、ランダムに色々な値を生成してくれます。名前や住所はもちろん、ポケモンの名前まで…(笑
しかし、全て英語です…。私は、雰囲気だけで使ってます。
Faker::Internet
基本形
Faker::Internet.password
#=>"W9vSoO7oRzE5aNkB"
基本形と言いつつ、以下の文字からランダムにが選ばれています。字数はバラバラです。
- 大文字
- 小文字
- 数字
逆に、%や$や#などの記号は選ばれません。
ここからは、基本形に条件を加えていったものです。
まずは、
字数に条件を設ける
【最低文字数】
Faker::Internet.password(min_length: 8) #最低でも8文字生成します
#=>"IgQnSpLk113E"
【最大文字数】
Faker::Internet.password(max_length: 20) #最大でも20文字生成します
#=>"RbL74hTbLxJl1UrI5327"
次に紹介する2つは、ランダムに選ばれる文字の種類についてです。
2つともtrue
とfalse
を切り替えることが出来ます。
文字の種類に条件を設ける
【大文字小文字】
Faker::Internet.password(mix_case: true) #大文字も小文字も数字も選ばれる可能性があります
#=>"FbSeLc2PyJ"
Faker::Internet.password(mix_case: false) #大文字が選ばれることはありません
#=>"1w24yba8g1wa"
【大文字小文字】はデフォルトでtrue
です。
【記号】
Faker::Internet.password(special_characters: true) #色々な記号が選ばれる可能性があります
#=>"!@*2zBxB7yD4yCl"
Faker::Internet.password(special_characters: false) #記号が選ばれることはありません
#=>"50MtIaT8kLaHv"
これは、もはや、基本形と全く同じ状態です。
【記号】については、デフォルトでfalse
です。
備考
それぞれの条件は単体で使うことも、組み合わせて使うことも可能です。生成したいパスワードに合わせて指定してください。組み合わせる際は、,
で区切ります。
例)
【最大文字数・記号可】
Faker::Internet.password(max_length: 10, special_characters: true)
#=>"#%&!4XxO"
【最低文字数・大文字不可】
Faker::Internet.password(min_length: 6, mix_case: false)
#=>"ysndk7ao450u"
【最低最高文字数・大文字不可・記号可】
Faker::Internet.password(min_length: 6, max_length: 10, mix_case: false, special_characters: true)
#=>"$l0cam32"
最後に
あくまで、ランダムに生成されているので、確率の問題で、たまに、数字が入らず、バリデーションで英数字最低1文字以上としていると、エラーになることがあります。現状の解決方法としては、最低文字数を多めに設定しておけば、数字がないために、エラーとなる可能性を減らすことが出来そうです。
正規表現みたいに、英数字最低1文字以上という指定の仕方があればいいのに…