aswww log

エンジニアの技術録。アプリとかウェブとか

fuelPHPでuserテーブルを更新したい場合

管理画面のユーザー情報編集画面を作りたい。
んで、userテーブルのpasswordをupdate_userで更新するには
変更前のパスワード、"old_passsword"が必要らしいので、編集情報入力画面にて以下のとおり予め取得してセッションに入れる。

public function action_input()
{
	$form = Input::get();

	$result = DB::select()->from('users')->where('username', $form['username'])->execute();

	Session::set('old_password', array('old_password' => $result[0]['password']));

※usersテーブル検索するためのusernameはGETで設定している$form['username']はGET

んで以下のとおりnewUser配列に入っている編集情報(パスワード、旧パスワード、メールアドレス)と同じくnewUser配列に入っているユーザー名を用いて以下のとおりupdate_user()で更新しようとすると...

$data = array('password' => $newUser['password'], 'old_password' => $newUser['old_password'], 'email' => $newUser['email']);

//$auth->update_user(array(更新カラム名 => 更新データ, ),ユーザー名);
$auth->update_user($data, $newUser['username']);

以下のエラーが表示された。

Auth\SimpleUserWrongPassword [ Error ]: Old password is invalid
PKGPATH/auth/classes/auth/login/simpleauth.php @ line 286

問題のPKGPATH/auth/classes/auth/login/simpleauth.php @ line 286を見てみると以下のような感じで

if (array_key_exists('password', $values))
{
    if (empty($values['old_password']) or $current_values->get('password') != $this->hash_password(trim($values['old_password'])))
    {
        throw new \SimpleUserWrongPassword('Old password is invalid');
    }

んで、これらそれぞれの値を検証してみたところ

・$values['old_password']
 セッションに入っている旧パスワード
・$current_values->get('password')
 DBから改めて検索したパスワード(旧パスワードと同じ)
$this->hash_password(trim($values['old_password']))
 セッションに入っている旧パスワードを更にハッシュ化したパスワード

fuelPHPのcreate_user()を用いて新しくユーザーを作成すると、passwordカラムに入力されたpasswordが自動的にハッシュ化されて保存される。それをselectで取り出す時もハッシュ化されたままなのにSimpleAuth->hash_password()で更にハッシュ化されてDBの値と付きあわされるので、一致するはずがない。
なので以下のとおりIF文を修正する。

if (empty($values['old_password']) or $current_values->get('password') != trim($values['old_password'])))

これでエラー解消されました!今は一旦PKGPATH/auth/classes/auth/login/simpleauth.php を直接修正しちゃったけど、今度ちゃんとオーバーライドして書きなおそう(´・ω・)