質問: val end そこで疑問に思ったのが次の項目です。ログインするときに、ユーザーネームとパスワードを入力するようにしようと考えています。 1,パスワードは暗号化されて、hasshed_password属性に入るとありましたが、入力されたpasswordが同じでも 暗号化されたパスワードは違う値で暗号化されるのでしょうか? たとえば Aさんのパスワードが abcde と入力され登録されたとします。 つぎに Bさんもパスワードを abcde と入力してきた場合です。 この場合、2つのパスワード abcde は違う値で暗号化されデータベースに保存されるのかどうかです。 2,上の質問が、同じ値として認識された場合は 下記のように同じ値を受け付けないようにするのでしょうか? add_index :customers, hashed_password, unique: true のようにunique: trueをインデックスと一緒に記述すればBさんは abcd とパスワードを入力したときに 「このパスワードはすでに使用されております。」というようなエラーを出すことは出来るのでしょうか? 3,*ユーザーネームは以下のように記述しておりますが間違っていないか不安です。 add_index :customers, name, unique: true 自分ではインデックスをつけて、重複禁止としているつもりです。 4,それともバリデーションで下記のようにした方がいいのでしょうか? validates :name, uniqueness: {case_sensitive: false} validates :hashed_password, uniqueness: {case_sensitive: false} ややこしい質問の仕方で申し訳ございませんがどなたか宜しくお願い申し上げます。
回答: > > 1. 入力されたpasswordが同じでも暗号化されたパスワードは違う値で暗号化されるのでしょうか? > > > はい、**ソルト**というユーザーごとの値が付加されて、同じパスワードでも違う値で保管されます(そうしない場合、「『よくあるパスワード』のハッシュ値」を持ってきて一致するか判定するだけで、そのパスワードが判明してしまいます)。 > > 2. 下記のように同じ値を受け付けないようにするのでしょうか? > > > 1が「はい」の時点で質問として意味をなさなくなっていますが、通常**他人が同じパスワードを設定する**ことに規制を掛ける必要はありませんし(どういう意図でしょうか)、もしやってしまうと「誰かがこのパスワードを設定している」ということが判明してしまいます。 > > 3. ユーザーネームは以下のように記述しておりますが間違っていないか不安です。 > > 4. それともバリデーションで下記のようにした方がいいのでしょうか? > > > DBレベルのバリデーションとRailsモデルのバリデーションは**両方入れてください**。DBだけだと、重複するユーザーを入れたときにDBエラーとなるので、ユーザーに次の案内をするのが難しくなります(2で挙げたように、パスワードの重複チェックはそもそも不要ですし、bcryptは不可逆なハッシュ化ですので不可能でもあります)。