Laravel3 を WebMatrix3 で開発しロリポップで公開する no.19 【パスワードの変更】

アカウント情報ページからリンクされた、パスワード変更を実装します。

controllers 配下に、 account ディレクトリを作成し、その中に password.php コントローラを作成してください。

<?php
    
class Account_Password_Controller extends Member_Controller
{
    public $restful = TRUE;

    public function get_index()
    {
        Asset::add(\'narrow-css\', \'css/narrow.css\', \'main\', array(\'media\' => \'screen and (max-width: 700px)\'));
        Asset::add(\'medium-css\', \'css/medium.css\', \'main\', array(\'media\' => \'screen and (min-width: 701px)\'));
        Asset::add(\'jquery\', \'js/jquery-1.10.0.js\', \'jquery-ui\');
        return View::make(\'account.password\');
    }
}

入力用フォームとして、 views/account 配下に password.blade.php を作成してください。

@layout(\'templates.general\')

@section(\'contents\')
            <div class=\"content\">
                <h2>アカウント情報【パスワード変更】</h2>
            </div>
{{ Form::open(\'account/password\') }}

@if (Session::has(\'password_errors\'))
<span class=\"error\">パスワード変更が出来ませんでした。</span>
@endif

<p>{{ Form::label(\'password\', \'現在のパスワード\') }}</p>
<p>{{ Form::password(\'password\') }}</p>

<p>{{ Form::label(\'newpassword\', \'新しいパスワード\') }}</p>
<p>{{ Form::password(\'newpassword\') }}</p>

<p>{{ Form::label(\'newpassword_confirmation\', \'新しいパスワードの確認\') }}</p>
<p>{{ Form::password(\'newpassword_confirmation\') }}</p>

<p>{{ Form::submit(\'変更\') }}</p>

{{ Form::token() }}

{{ Form::close() }}
@endsection

次に、 post 時の処理を password.php コントローラに追加します。

<?php
    
class Account_Password_Controller extends Member_Controller
{
    public $restful = TRUE;
    
    public function __construct()
    {
        parent::__construct();
        $this->filter(\'before\', \'csrf\')->on(\'post\');
    }

    public function get_index()
    {
        Asset::add(\'narrow-css\', \'css/narrow.css\', \'main\', array(\'media\' => \'screen and (max-width: 700px)\'));
        Asset::add(\'medium-css\', \'css/medium.css\', \'main\', array(\'media\' => \'screen and (min-width: 701px)\'));
        Asset::add(\'jquery\', \'js/jquery-1.10.0.js\', \'jquery-ui\');
        return View::make(\'account.password\');
    }

    public function post_index()
    {
        // バリデートのルール
        $rules = array(
            \'password\' => \'required|different:newpassword\',
            \'newpassword\' => \'required|confirmed\',
        );

        $v = Validator::make(Input::get(), $rules);
        if ($v->fails())
        {
            // バリデートを通らない場合は入力画面にリダイレクトし、エラーフラグを立てる
            return Redirect::to(\'account/password\')->with(\'password_errors\', true);
        }
        else
        {
            $auth = array(
                \'username\' => Auth::user()->email,
                \'password\' => Input::get(\'password\'),
            );

            // 入力されたパスワードが正しいか、ログインの成功の有無で判断する
            if (!Auth::attempt($auth))
            {
                // ログインが通らない場合は入力画面にリダイレクトし、エラーフラグを立てる
                return Redirect::to(\'account/password\')->with(\'password_errors\', true);
            }
            else
            {
                // ログインが通ったのでパスワードを変更する
                try
                {
                    $auth = Authentication::find(Auth::user()->id);
                    $auth->password = Input::get(\'newpassword\');
                    $auth->save();
                }
                catch (Exception $e)
                {
                    // 更新時に例外が発生した場合は入力画面にリダイレクトし、エラーフラグを立てる
                    return Redirect::to(\'account/password\')->with(\'password_errors\', true);
                }
            }

            return Redirect::to(\'mypage\')->with(\'message\', \'パスワードを変更しました。\');
        }
    }
}

大体がサインアップの時と同じ処理です。入力されたパスワードが正しいかのチェックを認証用の変数に詰め込み Auth::attempt() している部分は Auth::user()->password で得た値と Hash::check() して確認する方法でもいいと思います(むしろ好ましい?)。まあ、 attempt を通過できなくてもログアウトさせられるわけじゃないのでまあいいかなと思いました。

パスワード更新時はマイページにリダイレクトし、メッセージも送っています。そのメッセージを表示できるように、 mypage.blade.php を変更しました。

@layout(\'templates.general\')

@section(\'contents\')
            
@if (Session::has(\'message\'))
            <div class=\"message\">
{{ Session::get(\'message\') }}
            </div>
@endif
            <div class=\"header\">
	            ようこそ、○○○○○○○さん!<br />
            </div>

            <div class=\"content\">
	            <h1>マイページ</h1>
	            <p>ここはマイページです!</p>
            </div>
@endsection

データ更新時に、 authentication の updated_at を更新したいので、 authentication.php モデルを修正しました。

<?php

class Authentication extends Eloquent
{
    public static $table = \'authentication\';

    public static $timestamps = TRUE;

    public function set_password($password)
    {
        $this->set_attribute(\'password\', Hash::make($password));
    }
}

$timestamps 変数を足すとレコード更新時に自国が更新されるようになります。

それでは今回はここまで。

カテゴリー: Laravel3, Web, WebMatrix, ロリポップ タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です