いっきのblog

技術とか色々

laravel-adminでパスワードの設定の仕方

どうも、くずきです。
こないだLaravel + ReactWebサービスを構築した際に、社内の人間が使う管理画面も作ることになりました。
社内の人が使う管理画面なんて絶対に工数かけたくないので、調べた結果

qiita.com

の記事で試していた、

github.com

を使ってみた。結論から言うと神ってるほど楽。それはまた別記事で・・。

今回はlarave-adminでパスワードを扱う場合のやり方について書こうと思う。

パスワードの隠し方

larave-adminドキュメントがある程度そろっており、passwordの設定方法も記載されている。

http://laravel-admin.org/docs/#/en/model-form-fields?id=password-input

ただ、これだと若干わかりづらく、誤って$form->password('password')と設定するとパスワードが丸見えという状態になってしまう。
そこで、第二引数に

$form->password('password', trans('admin.password'));

trans('admin.password')をつけることによって、パスワードが隠れる状態にできる。

確認用パスワードの設定

大体のサービスでは、パスワード設定時には確認用に入力することがあると思う。
laravel-adminでも簡単に設定でき、先に結論を書いてしまうと

$form->password('password', trans('admin.password'))
  ->rules('required|confirmed')
  ->default(function ($form) {
    return $form->model()->password;
  });
  
$form->password('password_confirmation', trans('admin.password_confirmation'))
  ->rules('required')
  ->default(function ($form) {
    return $form->model()->password;
  });

Laravelにすでにあるバリデーションと同じように、rulesconfirmedの設定と
設定した入力名 + _confirmationの入力を用意すれば実装できる。

パスワードの暗号方法と前のパスワードとの比較

パスワードも大体のサービス(というかほぼ全部)では暗号化されていると思う。
じゃあどうやって、パスワードの暗号化と前のパスワードとの比較を行うかというと

$form->saving(function (Form $form) {
  if ($form->password && $form->model()->password != $form->password) {
    $form->password = bcrypt($form->password);
  }
});

saving関数は保存する直前の処理を書くことができ、これを利用する。
保存直前に入力パスワードの比較し、前回と異なった場合はbcryptで暗号化し、入力値を上書きする。

ここまでの方法全てのコードをまとめる。

$form->password('password', trans('admin.password'))
  ->rules('required|confirmed')
  ->default(function ($form) {
    return $form->model()->password;
  });
  
$form->password('password_confirmation', trans('admin.password_confirmation'))
  ->rules('required')
  ->default(function ($form) {
    return $form->model()->password;
  });
  
$form->ignore(['password_confirmation']);

$form->saving(function (Form $form) {
  if ($form->password && $form->model()->password != $form->password) {
    $form->password = bcrypt($form->password);
  }
});

終わりに

やってみると簡単だったが、ドキュメントだけだとわかりづらいかも。