Laravel Jetstream 1.0 セキュリティ

イントロダクション

Laravel Jetstreamのセキュリティ機能は、ユーザーが右上にあるプロフィールナビゲーションのドロップダウンメニューからアクセスします。Jetstreamのスカフォールドしたビューとアクションは、ユーザーのパスワード更新、2要素認証の有効/無効切り替え、他のブラウザのセッションのログアウトを提供します。

Screenshot of Security

2要素認証

Laravel Jetstreamは自動的に全Jetstreamアプリケーションへ2要素認証をサポートするスカフォールドを生成します。ユーザーが自分のアカウントで2要素認証を有効にしたら、Google認証システムのような無料の認証アプリケーションを使用する、QRコードをスキャンする必要があります。更に、1Passwordのようなセキュアなパスワードマネージャーへリストしたリカバリーコードを保存する必要もあります。

ユーザーがモバイルデバイスへアクセスできなくなった場合、Jetstreamのログインビューはモバイルデバイスの認証アプリケーションが提供する一時トークンの代わりに、回復コードの1つを使用して認証できるようにします。

ビュー/ページ

通常、この機能のビューとページにはカスタマイズすべきでありません。既に完全な機能が提供されているからです。ですが、以下に説明します。

パスワード更新

Livewire stack使用時は、resources/views/profile/update-password-form.blade.php Bladeテンプレートを使用しパスワード更新ビューを表示します。Inertiaスタック使用時は、resources/js/Pages/Profile/UpdatePasswordForm.vueテンプレートを使用しこのビューを表示します。

2要素認証

Livewire stack使用時は、resources/views/profile/two-factor-authentication-form.blade.php Bladeテンプレートを使用して2要素認証管理ビューを表示します。Inertiaスタック使用時は、resources/js/Pages/Profile/TwoFactorAuthenticationForm.vueテンプレートを使用してこのビューを表示します。

ブラウザセッション

Livewireスタックを使用時は、resources/views/profile/logout-other-browser-sessions-form.blade.php Bladeテンプレートを使用しブラウザセッション管理ビューを表示します。Inertiaスタック時は、resources/js/Pages/Profile/LogoutOtherBrowserSessionsForm.vueを使用しこのビューを表示します。

現在のユーザーとして認証済みな他のブラウザのセッションを安全にログアウトするために、この機能はLaravel組み込みのAuthenticateSessionミドルウェアを使用しています。

アクション

Jetstreamの典型的な機能として、セキュリティ関連のリクエストを満たすために実行するロジックはアプリケーションのアクションクラスに見ることができます。ただし、パスワード更新のみカスタマイズ可能です。一般的に2要素認証とブラウザセッションのアクションはJetstreamにカプセル化したままにすべきであり、カスタマイズは必要ありません。

パスワード更新

ユーザーが自分のパスワードを更新するとき、App\Actions\Fortify\UpdateUserPasswordクラスが実行されます。このアクションは入力の検証とユーザーパスワードの更新に責任を負います。

このアクションはパスワードに適用するバリデーションルールを決めているApp\Actions\Fortify\PasswordValidationRulesトレイトを使用しています。このトレイトのカスタマイズはユーザー登録、パスワードリセット、パスワード更新へ一律に影響を与えます。

パスワードバリデーションルール

App\Actions\Fortify\PasswordValidationRulesトレイトがLaravel\Fortify\Rules\Passwordバリデーションルールオブジェクトを使用していることに、皆さんお気づきでしょう。このオブジェクトはアプリケーションで要供されるパスワードを簡単にカスタマイズさせてくれます。要求されるパスワードはデフォルトで8文字列長です。しかし、以下のメソッドでパスワードへの要件をカスタマイズできます。

(new Password)->length(10)

// 最低1文字の大文字が必要
(new Password)->requireUppercase()

// 最低1文字の数字が必要
(new Password)->requireNumeric()

パスワード確認

アプリケーション構築時、アクション実行前にユーザーへパスワードを確認する必要が起きることはよくあります。Jetstreamはこれを簡単にできるように、機能を組み込んでいます。

Livewire

Livewireスタックを使用する場合、パスワードの確認アクションが必要なLivewireコンポーネントはLaravel\Jetstream\ConfirmsPasswordsトレイトを使用しなくてはなりません。次に、confirms-password Bladeコンポーネントを使って確認したいアクションをラップしてください。confirms-passwordのラッパーは、ユーザーのパスワードが確認されたときに実行するLivewireアクションを指定するためのwire:thenディレクティブを含んでいる必要があります。ユーザーのパスワードを確認したら、auth.password_timeout設定オプションが定義する秒数が経過するまで、再入力する必要はありません。

<x-jet-confirms-password wire:then="enableAdminMode">
    <x-jet-button type="button" wire:loading.attr="disabled">
        {{ __('Enable') }}
    </x-jet-button>
</x-jet-confirms-password>

次に確認するLivewireアクションの中で、ensurePasswordIsConfirmedメソッドを呼び出します。これは関連するアクションのはじめに行う必要があります。

/**
 * ユーザーの管理者モードを有効にする
 *
 * @return void
 */
public function enableAdminMode()
{
    $this->ensurePasswordIsConfirmed();

    // ...
}

Inertia

Inertiaスタックを使用している場合、確認したいアクションをJetstreamが提供するConfirmsPassword Vueコンポーネントを使いラップしてください。このラッパーコンポーネントはユーザーのパスワードが確認された時に呼び出すべきメソッドを起動するための@confirmedイベントをリッスンする必要があります。一度パスワードが確認されれば、auth.password_timeout設定オプションで定義してある秒数が経過するまで、再入力する必要はありません。

import JetConfirmsPassword from './Jetstream/ConfirmsPassword'

export default {
    components: {
        JetConfirmsPassword,
        // ...
    },
}

次に、確認する必要のあるアクションを起動する要素をコンポーネントでラップします。

<jet-confirms-password @confirmed="enableAdminMode">
    <jet-button type="button" :class="{ 'opacity-25': enabling }" :disabled="enabling">
        Enable
    </jet-button>
</jet-confirms-password>

最後に、password.confirmミドルウェアが確認アクションを実行するルートへ確実に指定してください。このミドルウェアはLaravelのデフォルトインストールに含まれています。

Route::post('/admin-mode', function () {
    // ...
})->middleware(['password.confirm']);

パスワード確認方法のカスタマイズ

確認時のユーザーパスワード確認方法をカスタマイズしたい場合も起きるでしょう。そのために、Fortify::confirmPasswordsUsingメソッドを使用します。このメソッドはクロージャを引数に取ります。このクロージャは認証済みユーザーインスタンスとリクエストのpassword入力値を引数に取ります。クロージャは指定ユーザーのパスワードが有効の場合にtrueを返します。通常、このメソッドはJetstreamServiceProviderbootメソッドで呼び出します。

use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;

Fortify::confirmPasswordsUsing(function ($user, string $password) {
    return Hash::check($password, $user->password);
});

ドキュメント章別ページ

スタック

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

バージョン

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる