ホームページ  >  記事  >  PHPフレームワーク  >  Laravel でクロスシステムおよびクロスドメインのアクセス許可管理を実装する方法

Laravel でクロスシステムおよびクロスドメインのアクセス許可管理を実装する方法

PHPz
PHPzオリジナル
2023-11-02 17:02:091075ブラウズ

Laravel でクロスシステムおよびクロスドメインのアクセス許可管理を実装する方法

Laravel は人気のある PHP フレームワークとして、豊富な機能と優れた拡張システムを備えています。パーミッション管理の実装に関しては、Laravel は豊富なサポートも提供しており、パーミッションに関連するさまざまな機能をシステムに簡単に実装できます。ただし、実際のアプリケーションでは、複数のシステム間の権限管理や、クロスドメインの権限検証が必要になる場合があり、その場合には、Laravelのクロスシステムおよびクロスドメインの権限管理機能を利用する必要があります。

この記事では、Laravel でクロスシステムおよびクロスドメインの権限管理を実装する方法を紹介します。主に次の内容が含まれます。

  1. Laravel の権限管理の基礎知識
  2. システム間権限管理の実装方法
  3. クロスドメイン権限検証の実装方法
  4. Laravel での権限管理の基礎知識

Laravel では、権限Laravel を通じて管理が可能 組み込みの Auth システム実装により、ユーザー認証、認可、パスワード リセットなどの機能が提供されます。認可機能は主に Gate クラスと Policy クラスを通じて実装されます。

Gate は、Laravel で認可を実装するコアクラスであり、ユーザーの権限を定義および決定するために使用できます。 Laravel では、app/Providers/AuthServiceProvider.php ファイルでゲートを定義できます。

public function boot()
{
    $this->registerPolicies();

    Gate::define('update-post', function ($user, $post) {
        return $user->id === $post->user_id;
    });
}

上の例では、「update-post」という名前のゲートを定義し、現在のユーザーに特定の記事を変更する権限があるかどうかを判断します。 。判定条件は、現在のユーザーIDと記事の著者IDが等しいことです。

Gate を使用して権限を決定する場合、authorize メソッドを直接使用できます:

public function update(Request $request, Post $post)
{
    $this->authorize('update-post', $post);

    //...
}

現時点で、現在のユーザーが記事を変更する権限を持っていない場合、403 例外が発生します。投げられた。例外情報をカスタマイズする必要がある場合は、テキスト内の 3 番目のパラメータを次のように渡すことができます。

$this->authorize('update-post', $post, '你没有权限修改这篇文章');

現時点で、現在のユーザーに記事を変更する権限がない場合、403 例外が発生します。がスローされ、例外情報は「この記事を編集する権限がありません。」です。

上記の例では、$post オブジェクトの直接送信を許可判定に使用しました。もちろん、許可判定のために他のパラメータを渡す必要がある場合は、3 番目のパラメータを介して追加のデータを配列の形式で渡すこともできます。

$this->authorize('update-post', ['post' => $post, 'extra_data' => 'foo']);

Gate で判定する場合は、渡されたデータを取得できます。 2番目のパラメータ:

Gate::define('update-post', function ($user, $post, $extra_data) {
    // can access $extra_data['extra_data'] here
    return $user->id === $post->user_id;
});

Gateに加えて、LaravelはPolicyと呼ばれる別のクラスも提供しており、これも認可の実装に使用できます。対照的に、Policy はより柔軟であり、開発者は can と呼ばれるパブリック メソッドを定義することで、より詳細な権限制御を実装できます。

class PostPolicy
{
    public function canUpdate($user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

現時点では、権限の判断に Gate を使用する場合、ポリシー メソッドを使用できます。 Gate を Policy に関連付けるには:

Gate::policy(Post::class, PostPolicy::class);

$this->authorize('update', $post);

上の例では、policy メソッドを通じて Gate クラスと PostPolicy クラスを関連付けます。そのため、authorize メソッドを使用すると、Laravel は自動的に PostPolicy の canUpdate メソッドを呼び出して権限を決定します。このとき、現在のユーザーに記事を変更する権限がない場合は、403 例外がスローされます。

  1. クロスシステム権限管理の実装方法

実際のアプリケーションでは、あるシステムから別のシステムに権限情報を転送する必要がある場合があります。たとえば、システム A での認証と認可が完了した場合、次はシステム B で操作を実行する必要がありますが、ユーザーが再度認証と認可を行う必要はありません。このとき、システム A の認可情報をシステム B に転送することで、シームレスな権限管理を実現できます。

Laravel では、JWT (JSON Web Token) を使用してシステム間の権限管理を実現できます。 JWT は、ネットワーク環境で情報を安全に送信するためのオープン標準です。 JSON ベースの情報をインターネット上で安全に送信する方法を指定します。 JWT は、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。このうち、ヘッダーとペイロードは Base64 でエンコードされた JSON 文字列であり、署名はヘッダー、ペイロード、シークレットから HS256 などの暗号化アルゴリズムを使用して生成されたハッシュ値です。

Laravel では、tymon/jwt-auth 拡張パッケージを使用して JWT を作成および解析できます。まず、tymon/jwt-auth 拡張パッケージをインストールする必要があります。

composer require tymon/jwt-auth

インストールが完了したら、JWT の基本構成を実行する必要があります。これは config/jwt.php ファイルで構成でき、主に以下が含まれます:

  • secret: 暗号化キー
  • ttl: トークンの有効期間 (分単位)
  • プロバイダー: ユーザー プロバイダー。ユーザー ID の検証に使用されます。
return [
    // ...

    'secret' => env('JWT_SECRET', 'some-secret-string'),

    'ttl' => env('JWT_TTL', 60),

    'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),

    'providers' => [
        'users' => [
            'model' => AppModelsUser::class,
            'credentials' => ['email', 'password'],
        ],
    ],

    // ...
];

構成が完了したら、システムで JWT を生成し、それを別のシステムに渡すことができます。別のシステムでは、JWT 解析機能を使用して、JWT 内のユーザー情報と権限情報を取得できます。具体的には、Auth::setUser メソッドを使用して、解析されたユーザー情報を現在のユーザーとして設定し、Gate を使用して権限を決定できます。

以下は簡単な例です:

システム A では、JWT を使用してトークンを生成し、それをシステム B に渡すことができます:

$token = JWTAuth::fromUser($user);

return redirect('http://system-b.com?token=' . $token);

システム B では、トークンを解析してユーザー情報と権限情報を抽出できます:

use IlluminateSupportFacadesAuth;
use TymonJWTAuthFacadesJWTAuth;

$token = request()->get('token');

$user = JWTAuth::parseToken()->authenticate();

Auth::setUser($user);

// ...

Gate::authorize('update', $post);

在上面的例子中,我们使用JWTAuth::parseToken()方法解析Token,成功后,通过authenticate()方法获取到用户信息,并使用Auth::setUser方法将用户信息设置为当前用户。最后,我们可以使用Gate的authorize方法判断当前用户是否有权限进行某些操作。

需要注意的是,为了保证传输安全,我们应该务必在传送Token时进行加密传输,或使用HTTPS协议进行通信。

  1. 如何实现跨域的权限验证

在实际应用中,由于系统之间的跨域限制,可能会导致无法直接进行权限验证。此时,我们可以使用跨域资源共享(CORS)解决跨域问题。CORS是一种允许服务器进行跨域访问的机制,可以通过在响应头中设置Access-Control-Allow-*等相关选项实现。

在Laravel中,要启用CORS,可以使用spatie/laravel-cors扩展包。首先需要安装该扩展包:

composer require spatie/laravel-cors

然后,在config/cors.php文件中进行配置:

return [
    'paths' => ['api/*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => [],

    'max_age' => 0,

    'supports_credentials' => true,
];

在完成配置后,我们可以在需要使用CORS的路由或控制器中添加CORS相关中间件:

Route::group(['middleware' => ['cors']], function () {
    // ...
});  

public function update(Request $request, Post $post)
{
    $this->authorize('update-post', $post);

    //...
}

在上面的例子中,我们通过将路由或控制器添加到“cors”中间件组中,启用了CORS功能。此时,我们就可以支持跨域的权限验证了。

需要注意的是,为了避免出现安全问题,我们需要仔细配置CORS相关参数,确保只允许来自指定域名和端口的请求访问我们的系统。同时,我们也需要在服务器端使用CSRF和其他相关功能保护系统的安全。

以上就是Laravel でクロスシステムおよびクロスドメインのアクセス許可管理を実装する方法的详细介绍。需要说明的是,本文只是提供了一些基本的实现思路和代码示例,具体的实现细节和方案根据实际的应用情况会有所不同。

以上がLaravel でクロスシステムおよびクロスドメインのアクセス許可管理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。