LoginSignup
0
0

More than 1 year has passed since last update.

[備忘録]Laravel10 ログイン時だけ表示したい画面をsanctumで実現

Last updated at Posted at 2023-03-02

プロジェクト名は example-app
Windows11 WSL2 Ubuntu22.04環境で実施
管理者登録機能は無し(tinkerで直接DBに投入)

プロジェクト作成

curl -s https://laravel.build/example-app | bash

プロジェクトディレクトリに移動して開発環境起動してsanctumを使えるようにする

cd example-app
./vendor/bin/sail up
composer require laravel/sanctum

マイグレーションを実行
もし、DB接続エラーみたいなの出たら.envDB_HOSTmysql127.0.0.1に変えたら動いた気がする

php artisan migrate

config/auth.phpファイルでguardsのapiのdriverをsanctumに変更

'guards' => [
    // ...
    'api' => [
        'driver' => 'sanctum',
        'provider' => 'users',
        'hash' => false,
    ],
],

app/Http/Kernel.phpファイルでapiミドルウェアを追加(コメントアウトを外す)

protected $middlewareGroups = [
    'web' => [
        // ...
    ],

    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

tinkerで管理者を追加

php artisan tinker
>>> $user = new App\Models\User
>>> $user->name = 'admin'
>>> $user->email = 'admin@example.com'
>>> $user->password = bcrypt('password')
>>> $user->save()

ログイン画面(resources/views/auth/login.blade.php)ファイルを作成

<form method="POST" action="{{ route('login') }}">
    @csrf

    <div>
        <label for="email">メールアドレス</label>
        <div>
            <input id="email" type="email" name="email" value="{{ old('email') }}" required autofocus>
        </div>
    </div>

    <div>
        <label for="password">パスワード</label>
        <div>
            <input id="password" type="password" name="password" required>
        </div>
    </div>

    <div>
        <div>
            <button type="submit">ログイン</button>
        </div>
    </div>
</form>

ルーティングをroutes/web.phpに定義

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;

// ログイン画面を表示する
Route::get('/login', function () {
    return view('auth.login');
})->name('login');

// ログイン処理を実行する
Route::post('/login', function () {
    $credentials = request()->only('email', 'password');

    if (Auth::attempt($credentials)) {
        request()->session()->regenerate();
        return redirect()->intended('/dashboard');
    }

    return back()->withErrors([
        'message' => '認証失敗',
    ]);
})->name('login');

// ログアウト処理を実行する
Route::post('/logout', function () {
    Auth::logout();
    request()->session()->invalidate();
    request()->session()->regenerateToken();

    return redirect('/');
})->name('logout');

// 認証が必要なページ
Route::middleware('auth')->group(function () {
    // ダッシュボード画面とか
    Route::get('/dashboard', function () {
        return view('dashboard');
    })->name('dashboard');
});

ログアウトボタン

<form method="POST" action="{{ route('logout') }}">
    @csrf
    <button type="submit">ログアウト</button>
</form>

ログイン判定してコンテンツを出し分けたいとき

@if (Auth::check())
    <!-- ログイン済みの場合に表示するコンテンツ -->
@else
    <!-- ログインしていない場合に表示するコンテンツ -->
@endif
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0