2017年3月8日水曜日

Laravel 5.4+MariaDBでログイン実装

過去の記事でLaravel環境のセットアップをしました(参照: http://kusanokai.blogspot.jp/2017/03/laradocklaravel_5.html)。

今回は、Laravelを用いたログインの実装について進めたいと思います。

[環境]
  • PHP 7.0.9
  • Laravel 5.4.15
  • MariaDB 10.1.21

[手順]
  1. 新規Laravelプロジェクトの作成(「logintest」という名前で作成しています)
  2. $ composer create-project laravel/laravel logintest

  3. DBの準備
  4. 使用するDBについて準備しておきます。
    laradockでデフォルトで環境構築した場合は、rootユーザ(パスワード:root)、
    もしくは、homestead(パスワード:secret)が使えます。
    laradockでmariadbを構築した場合は、まずmariadbコンテナに入ります。
    $ docker exec -it laradock_mariadb_1 /bin/bash
    mariadbへログイン。
    # mysql -h localhost -uroot -proot
    ログイン後、適当にDBを作成します。
    MariaDB [(none)]> CREATE DATABASE logintest;

  5. LaravelプロジェクトのDB設定
  6. Laravelプロジェクト、.envファイルのDB設定を変更しておきます。
    DB_CONNECTION=mysql
    DB_HOST=mariadb
    DB_PORT=3306
    DB_DATABASE=logintest
    DB_USERNAME=root
    DB_PASSWORD=root
    
    laradockで環境を作った場合は、DB_HOSTをmariadbにしておきます。
    DB_USERNAMEとDB_PASSWORDは2で使用したユーザ/パスワードを使用。

  7. migrateファイルの確認
  8. Laravelでは、新しくプロジェクトを作成した時点でユーザ用のmigrateファイルができています。

    ・./database/migrations/2014_10_12_000000_create_users_table.php
    <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateUsersTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->string('email')->unique();
                $table->string('password');
                $table->rememberToken();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('users');
        }
    }

    ・./database/migrations/2014_10_12_100000_create_password_resets_table.php
    <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreatePasswordResetsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('password_resets', function (Blueprint $table) {
                $table->string('email')->index();
                $table->string('token')->index();
                $table->timestamp('created_at')->nullable();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('password_resets');
        }
    }
    ユーザやパスワードリセットの設定が入っています。
    とりあえず、このまま使うことにして、DBに反映させてみます。

  9. 試しにmigrate
  10. migrateファイルからmigrateを実行するには、下記のコマンドを実行します。
    (laradockで環境構築した場合は、workspaceコンテナから実行)
    # php artisan migrate
    結果、エラー。。
    [Illuminate\Database\QueryException]                                                         
      SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key  
       length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
    [PDOException]                                                                               
      SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key  
       length is 767 bytes  
    Laravel5.4から絵文字対応でutf8mb4サポートしたことで、mariaDBか古いバージョンのMySQLで引っかかるらしいです。
    https://laravel-news.com/laravel-5-4-key-too-long-error

  11. AppServiceProvider.phpに設定追加
  12. 対策としては、「./app/Providers/AppServiceProvider.php」に設定を追加します。
    use Illuminate\Support\Facades\Schema;
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
    (以下省略)
  13. 再度migrate
  14. いけるはず。

  15. Laravelのmake:auth機能でログイン機能の作成
  16. Laravel 5.2からはmake:authってのが使えるようなので、それ使います。
    (laradockで環境構築した場合は、workspaceコンテナから実行)
    # php artisan make:auth
    Authentication scaffolding generated successfully.

  17. Routeの確認
  18. なにやらいっぱいRouteができてるのが確認できます。
    # php artisan route:list
    +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
    | Domain | Method   | URI                    | Name             | Action                                                                 | Middleware   |
    +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
    |        | GET|HEAD | /                      |                  | Closure                                                                | web          |
    |        | GET|HEAD | api/user               |                  | Closure                                                                | api,auth:api |
    |        | GET|HEAD | home                   |                  | App\Http\Controllers\HomeController@index                              | web,auth     |
    |        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest    |
    |        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web,guest    |
    |        | POST     | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web          |
    |        | POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest    |
    |        | GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest    |
    |        | POST     | password/reset         |                  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest    |
    |        | GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest    |
    |        | GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest    |
    |        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web,guest    |
    +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
    実はこれでできています。

  19. 試しにログイン
  20. http://localhost/registerへアクセスすると・・・、ユーザ作成が可能です。



    ログイン画面に行って(http://localhost/login)、ログインID/パスワードを入力。



    ログインできることが確認できます。


ほぼ、コードを書かずにユーザ登録、ログイン、パスワードリセットができてしまいました・・。
とても便利ですね。

最近だと、クライアントサイドはJavascriptに任せて、サーバ側はAPIを提供するのみ、となっているパターンも多いので、次回はAPIの使用を検討してみたいと思います。

1 件のコメント:

  1. Lucky 12 Casino - MapyRO
    Play the exciting Lucky 12 Casino in Slots, Blackjack, Roulette, Video Poker 의정부 출장마사지 and live dealer 광명 출장안마 games. Discover 의왕 출장샵 the 포천 출장마사지 Casino. Rating: 4 · ‎7 votes · ‎Price range: 서울특별 출장안마 $

    返信削除