Laravel開発:2.ユーザ認証と管理画面を作成する

はじめに

https://ksysnote.com/php/laravel-mamp-setup/

こちらの続きとなっています。

ユーザと管理者で認証を分けるために、ユーザの管理テーブルとして「clients」を追加しています。

管理画面は「 Voyager」を使用しています。

環境:

OS : macOS High Sierra 10.13.6

MAMP : 5.1

Laravel : 5.7.6

DB設定

MAMPを実行するとMAMPのTop画面が表示されます。その中にMySQLの設定情報が表示されています。

 こちらの「phpMyAdmin」のリンクからphpMyAdminを表示してプロジェクトで使用するデータベースを作成します。

データベースを作成したら「.env」を編集します。

APP_URL=http://localhost:8888 // MAMPで設定されているPORTに変更

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=laravel  // DB名
DB_USERNAME=root
DB_PASSWORD=root

ユーザ認証

認証機能を追加する

Laravel標準の認証機能を追加する

$ php artisan make:auth

ユーザーのモデルを作成

ユーザーはClientテーブルに管理して、標準のusersテーブルは管理者で管理していきます。

php artisan make:model Client -m

「/database/migrations」ディレクトリにマイグレーションファイルが作成されています。DATE_TIME_create_users_table.php の内容を DATE_TIME_create_clients_table.php にコピーします。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateClientsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('clients', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('clients');
    }
}

マイグレーション

$ php artisan migrate

phpmyAdminで確認するとテーブルが作成されていることを確認することができます。

認証するテーブルをusersからclientsに変更をする

「/config/auth.php」

    // デフォルトの認証ガード        
    'defaults' => [
        // 認証ガードを変更する。guardとpasswordsの設定は以下に記述します
        'guard' => 'clients',
        'passwords' => 'clients',
    ],

    // 認証ガード
    'guards' => [

        ...

        // 新しく認証ガードを追加します
        'clients' => [
            'driver' => 'session',
            'provider' => 'clients',
        ],
    ],

    // 認証プロバイダー
    'providers' => [

        ...

        // 新しく認証プロバイダーを追加します。
        'clients' => [
            'driver' => 'eloquent',
            'model' => App\Client::class,
        ],
    ],

    // 認証パスワード
    'passwords' => [

        ...

        //password追加
        'clients' => [
            'provider' => 'clients',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

・デフォルトの認証ガードを今回新しく追加した「Client」に変更しています。

RegisterControllerの編集

アカウント追加時の処理をClientに変えるために、「RegisterController」を編集します。

「/app/Http/Controller/Auth/RegisterController.php」

//use App\User;
use App\Client;
...

class RegisterController extends Controller
{

    ...

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            // メールアドレスのユニークをclientテーブルに変更
            'email' => 'required|string|email|max:255|unique:clents',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }

    ...

    protected function create(array $data)
    {
        // モデルを変更
        return Client::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

Clientモデルの編集

Userモデルを参考に、Clientモデルを編集していきます。

「/app/Client.php」

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Client extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

確認

「http://localhost:8888/home」にアクセスするとログイン画面が表示されます。

右上の「Register」メニューをクリックして登録画面からユーザを追加します。

無事にログインができたら完了です

管理画面

続いて管理画面を作成していきます。今回はVoyagerを使用して簡単に管理画面を実装していきたいと思います。

Voyagerのインストール

コマンドからVoyagaerをインストールします。

$ composer require tcg/voyager
$ php artisan voyager:install

セッションクッキーを管理画面とユーザで分ける

「/app/.env」

//追記
SESSION_COOKIE=auth
SESSION_COOKIE_ADMIN=auth-admin

「/config/session.php」

<?php

$conf = [

    ...

];

// 管理画面のセッションクッキーを変更する
$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';

if (strpos($uri, '/admin/') === 0 || $uri === '/admin') {
    $conf['cookie'] = env(
        'SESSION_COOKIE_ADMIN',
        str_slug(env('APP_NAME', 'laravel'), '_').'_admin_session'
    );
}

return $conf;

管理画面の認証ガードを変更する

「/config/auth.php」

<?php

$conf = [

    ...

];


// 管理画面の場合は、デフォルトの認証ガードをuserに変更する
$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';

if (strpos($uri, '/admin/') === 0 || $uri === '/admin') {
    $conf['defaults'] = [
        'guard' => 'web',
        'passwords' => 'users',
    ];
}

return $conf;

管理者アカウントを追加する

$ php artisan voyager:admin [email protected] --create

 Enter the admin name:
 > admin

 Enter admin password:
 >

 Confirm Password:
 >

Creating admin account
The user now has full access to your site.

コマンドから管理者アカウントを追加します。

確認

「http://localhost:8888/admin」

管理画面が表示されて、先程追加した管理者アカウントでログインができたら完了です。

ユーザーの管理

管理画面にログインしてサイドメニューの「Tools > Database」からテーブルの管理ができそうです。

一覧からclientsの「Add BREAD to this table」をクリックしてBREADを追加します。

編集画面が表示されるので、一番下までスクロールして「Submit」をクリックします。

ユーザー情報が一覧で見れるようになります。

参考:

https://tac-blog.tech/index.php/2018/08/14/voyager-multi-auth/
PHP DIY開発 Laravel Admin【VOYAGER】を使ってCMSを構築する
システム開発はWordpressを少しだけカスタマイズするだけの知識しか無いのですが、今回はPHPで人気のあるフレームワークLaravelを学んで見たいと思います。(仮想環境に開発環境を構築すれば、あとはWEBからの情報収集で何とかなるもの

コメント

タイトルとURLをコピーしました