前提・実現したいこと
パスワード変更機能を実装しています。現段階で機能自体は出来上がってはいるのですが、まだ以下の様なシンプルな状態です。
パスワードの入力フォームがあり、保存ボタンを押すとデータが書き変わる。
ここにもう一つ、現在のパスワードを入力させる事でバリデーションをかけ、「間違っている場合はパスワードの変更が出来ない」機能を付けようと思っています。
自分なりに考えた方法は以下の通りです。
current_password_digest
カラムを新たに作る。- ユーザーには現在のパスワード(
name="current_password"
)と新しいパスワード(name="password"
)を入力してもらう。 - それぞれの値を暗号化する。
- 「ログイン中のユーザーの
password_digest
」と、「送信されたcurrent_password_digest
」が一致するかを判定。 - 一致したら新しいパスワード情報に変更する。
- 一致しなかったらエラー文を表示させる。
該当のソースコード
users/setting.html.erb
Rails
1<% if @error_message %> 2 <div class="form-error"> 3 <%= @error_message %> 4 </div> 5<% end %> 6<%= form_tag("/users/#{@user.id}/update_account", {multipart: true}) do %> 7 <ul> 8 <li> 9 <div class="col-1">Current password:</div> 10 <div class="col-2"><input size="40" name="current_password" type="password" value="<%= @current_password %>"></div> 11 </li> 12 <li> 13 <div class="col-1">New password:</div> 14 <div class="col-2"><input size="40" name="password" type="password" value="<%= @password %>"></div> 15 </li> 16 <li> 17 <div class="save"><input id="button" type="submit" value="Save" onclick="myfunk()"></div> 18 </li> 19 </ul> 20<% end %>
users_controller.rb
def update_account @user = User.find_by(id: params[:id]) @user.current_password = params[:current_password] @user.password = params[:password] if @user.save # 「ログイン中のユーザーの password_digest 」と、「送信された current_password_digest 」が一致するかを判定。 if @user.password && @user.authenticate(params[:current_password]) @user.save flash[:notice] = "パスワードを変更しました" redirect_to("/users/#{@user.id}/setting") else @error_message = "現在のパスワードが間違っています" @current_password = params[:current_password] # 直前に入力したCurrent passwordを初期値としてセット。 @password = params[:password] # 直前に入力したNew passwordを初期値としてセット。 render("/users/#{@user.id}/setting") end end end
補足
上記のコードを組み立ててみたのですが、current_password
を暗号化する方法が分かりませんでした。
password_digest
カラムに関しては、bcrypt gem
をインストールする事で has_secure_password
メソッドが使えるようになりました。その結果パスワードを入力すると password_digest
カラムには暗号化されたパスワードが保存されるようになりました。
これはRubyが「 password_digest
と言うカラム名を自動で読み取って」暗号化してくれているのでしょうか?そこの仕組みが良く分かっておらず、本物のパスワード(password
)とは他の文字列(ここでは私が命名した current password
)をdigestにする方法が分かりません…。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/30 04:49
2021/01/30 04:51
2021/01/30 06:58