検索
ホームページPHPフレームワークLaravelLaravel jwtマルチテーブル検証分離

Laravel jwtマルチテーブル検証分離

なぜ分離する必要があるのか​​

同じlaravelプロジェクトに複数の端末(モバイル端末、管理端末など)があり、すべてユーザーにjwtを使用する必要がある場合検証では、複数のユーザーテーブルがある場合(通常は存在します)、トークンの分離を行う必要があります。そうしないと、モバイル側のトークンも管理側に要求でき、ユーザーが権限を超えてしまうという問題が発生します。

この問題が発生する理由は、laravel の jwt トークンがデフォルトでデータテーブルの主キーの値のみを格納し、どのテーブルであるかを区別しないためです。したがって、トークンに含まれる ID がユーザー テーブルに存在する限り、不正な検証が行われてしまいます。

laravel の jwt トークンの元の外観を見てみましょう:

{
    "iss": "http://your-request-url",
    "iat": 1558668215,
    "exp": 1645068215,
    "nbf": 1558668215,
    "jti": "XakIDuG7K0jeWGDi",
    "sub": 1,
    "prv": "92d5e8eb1b38ccd11476896c19b0e44512b2aacd"
}

データを運ぶサブフィールドはサブフィールドで、他のフィールドは jwt の検証フィールドです。

sub の値が 1 であることがわかるだけで、それがどのテーブルまたはバリデーターに属しているかは示されません。このトークンが検証ミドルウェアを通過すると、さまざまなガードを使用して、対応するテーブル ID 1 を持つユーザーを取得できます (ガードについて詳しくは、laravel のドキュメントを確認してください)。

解決策

ユーザーのオーバーリーチの問題を解決するには、トークンにカスタム フィールドを追加して、どのテーブルまたはバリデータがトークンを生成したかを区別し、それを検証する独自のミドルウェアを作成するだけです。カスタムフィールドは私たちの期待と一致しています。

カスタム情報をトークンに追加する

jwt 検証を使用するには、ユーザー モデルが JWTSubject インターフェイスを実装する必要があることがわかっています (コードは jwt ドキュメントから取得されます):

<?php namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    // Rest omitted for brevity

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

これら 2 つの実装されたメソッドの機能を見てみましょう:

  • getJWTIdentifier: jwt ステートメントに保存される識別子を取得します。実際には、主キー フィールドを返す必要があります。ユーザー テーブルを識別する名前です。返される内容は次のとおりです。主キー 'id' です。
  • getJWTCustomClaims: jwt 宣言に追加されるカスタム キーと値のペアを含む配列を返します。空の配列が返されます。ここではカスタム情報は追加されていません。

次に、getJWTCustomClaims メソッドを実装するユーザー モデルにカスタム情報を追加できます。

管理者モデル:

/**
 * 额外在 JWT 载荷中增加的自定义内容
 *
 * @return array
 */
public function getJWTCustomClaims()
{
    return ['role' => 'admin'];
}

モバイル ユーザー モデル:

/**
 * 额外在 JWT 载荷中增加的自定义内容
 *
 * @return array
 */
public function getJWTCustomClaims()
{
    return ['role' => 'user'];
}

ここにユーザー ID としてロール名が追加されます。

管理者によって生成されたトークンは次のようになります:

{
    "iss": "http://your-request-url",
    "iat": 1558668215,
    "exp": 1645068215,
    "nbf": 1558668215,
    "jti": "XakIDuG7K0jeWGDi",
    "sub": 1,
    "prv": "92d5e8eb1b38ccd11476896c19b0e44512b2aacd",
    "role": "admin"
}

モバイル ユーザーによって生成されたトークンは次のようになります:

{
    "iss": "http://your-request-url",
    "iat": 1558668215,
    "exp": 1645068215,
    "nbf": 1558668215,
    "jti": "XakIDuG7K0jeWGDi",
    "sub": 1,
    "prv": "92d5e8eb1b38ccd11476896c19b0e44512b2aacd",
    "role": "user"
}

追加された役割フィールドは、ユーザー モデルに対応します。

次に、ミドルウェアを自分で書きます。トークンを解析した後、それが必要な役割であるかどうかを判断します。一致する場合はパスし、一致しない場合は 401 を報告します。

jwt ロール検証ミドルウェアを作成します

これはグローバルに使用可能なミドルウェアです (ユーザー検証ミドルウェアの前に使用することをお勧めします):

<?php /**
 * Created by PhpStorm.
 * User: wlalala
 * Date: 2019-04-17
 * Time: 13:55
 */

namespace App\Http\Middleware;

use Closure;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class JWTRoleAuth extends BaseMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param $request
     * @param Closure $next
     * @param null $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role = null)
    {
        try {
            // 解析token角色
            $token_role = $this->auth->parseToken()->getClaim('role');
        } catch (JWTException $e) {
            /**
             * token解析失败,说明请求中没有可用的token。
             * 为了可以全局使用(不需要token的请求也可通过),这里让请求继续。
             * 因为这个中间件的责职只是校验token里的角色。
             */
            return $next($request);
        }

        // 判断token角色。
        if ($token_role != $role) {
            throw new UnauthorizedHttpException('jwt-auth', 'User role error');
        }

        return $next($request);
    }
}

jwt ロール検証検証ミドルウェアを登録します

app/Http/Kernel.php にミドルウェアを登録します:

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        // ...省略 ...

        // 多表jwt验证校验
        'jwt.role' => \App\Http\Middleware\JWTRoleAuth::class,
    ];

jwt ロール検証ミドルウェアを使用します

次に、ユーザー検証が必要なルートを追加します。ミドルウェアをグループに追加します。

Route::group([
    'middleware' => ['jwt.role:admin', 'jwt.auth'],
], function ($router) {
    // 管理员验证路由
    // ...
});

Route::group([
    'middleware' => ['jwt.role:user', 'jwt.auth'],
], function ($router) {
    // 移动端用户验证路由
    // ...
});

これで、jwt の複数テーブルのユーザー検証の分離が完了しました。

Laravel 関連の技術記事の詳細については、Laravel チュートリアル 列にアクセスして学習してください。

以上がLaravel jwtマルチテーブル検証分離の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
ズームコールを超えて:分散チームを接続するための創造的な戦略ズームコールを超えて:分散チームを接続するための創造的な戦略Apr 26, 2025 am 12:24 AM

ToenhanceEngagementAndCohesionAmongDistributedTeamSbeyOndzoom、実装してください

最新のLaravelバージョンの壊れた変更は何ですか?最新のLaravelバージョンの壊れた変更は何ですか?Apr 26, 2025 am 12:23 AM

laravel10introducesseveralbreakingchanges:1)itrequirephp8.1orhigher、2)therouteSerseprovidernowuseSabootdododdoddoddoddoddoddoddoddoddoddoddoddod forloadingroutes、3)the withtimestamps()methodoneLoquentrelationshipsissisdedisded and4)andosnowprefrefreferure()

生産性パラドックス:リモート設定での焦点と動機を維持する生産性パラドックス:リモート設定での焦点と動機を維持するApr 26, 2025 am 12:17 AM

WOCUSANDMOTIVERIANCIANGINTIANIVERMOTEWORK、CREATERUCTUREDENVIRONMENT、MANAGEDIGITALDISTRACTIONS、FOSTERMOTIVERIVESTROUGHSOCIAL-INTERACTIONSIONDANDGOALSETTINTING、MANTEMESTECHNOLOGY.1)SetUpAdedicatedWorkStickEndStickToTtoTtoTtoTtoTototine。

遠くからの信頼の構築:分散環境でのコラボレーションの育成遠くからの信頼の構築:分散環境でのコラボレーションの育成Apr 26, 2025 am 12:13 AM

tofostercollaboration and trustinRemoteteams、exprenttheStrategies:1)定期的で構造化された構造化された通信を確立します。

最新のLaravelバージョンの重要な機能は何ですか?最新のLaravelバージョンの重要な機能は何ですか?Apr 26, 2025 am 12:01 AM

Laravelの主な機能の最新バージョンには、1。Laraveloctaneのアプリケーションパフォーマンスの向上、2。モデルファクトリーサポート関係と状態定義の改善、3。強化された職人コマンド、4。これらの機能は、開発効率とアプリケーションのパフォーマンスを大幅に改善しますが、潜在的な問題を回避するために注意して使用する必要があります。

インクルージョンの幻想:リモートワークにおける孤立と孤独への対処インクルージョンの幻想:リモートワークにおける孤立と孤独への対処Apr 25, 2025 am 12:28 AM

トコンバティソルメントアンドロネリネスは、レモであり、regultionを実現し、等間grothopportunitionを提供し、効率的に使用します

フルスタック開発のためのLaravel:包括的なガイドフルスタック開発のためのLaravel:包括的なガイドApr 25, 2025 am 12:27 AM

laravelispopopularfulfull-stackdevelopment becuseiTOfferseamlessbbackEndpowendPowerandfflexibility.1)simplifyDatabaseItteractions.2)asbladetemplatingEngineallowsforclean、dynamictmltemplates.3)Laravelmix

ビデオ会議対決:リモート会議に適したプラットフォームを選択するビデオ会議対決:リモート会議に適したプラットフォームを選択するApr 25, 2025 am 12:26 AM

ビデオ会議プラットフォームを選択する際の重要な要因には、ユーザーインターフェイス、セキュリティ、および機能が含まれます。 1)ズームなど、ユーザーインターフェイスは直感的である必要があります。 2)セキュリティに注意を払う必要があり、Microsoftチームはエンドツーエンドの暗号化を提供します。 3)機能は要件を一致させる必要があり、Googlemeetは短い会議に適しており、Ciscowebexは高度なコラボレーションツールを提供します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール