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

PHP

はじめに

Laravel開発:1.環境構築をMAMPを使用して作成する
はじめに Laravelを使用するのは今回が初めてなので、開発環境をどう作成していくかも含めてまとめて行こうと思います。 PHPの開発環境にはMAMPを使用します。MAMPはMac環境でApache、MySQL、PHPの環境を作成す...

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

ユーザと管理者で認証を分けるために、ユーザの管理テーブルとして「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 admin@example.com --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」をクリックします。

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

参考:

Laravel5.6, 5.7「Voyager」パッケージの認証をフロントと分離!(multi-auth)
Laravel5.6, 5.7, の管理画面パッケージ「Voyager」。このパッケージを使ってフロントと管理画面の認証分離(multi-auth)を実装します。
PHP DIY開発 Laravel Admin【VOYAGER】を使ってCMSを構築する
システム開発はWordpressを少しだけカスタマイズするだけの知識しか無いのですが、今回はPHPで人気のあるフレームワークLaravelを学んで見たいと思います。(仮想環境に開発環境を構築すれば、あとはWEBからの情報収集で何とかなるもの

 

コメント

  1. […] こちらの内容はブログにアップしています。 […]