>  기사  >  PHP 프레임워크  >  Laravel에서 시스템 간 및 도메인 간 권한 관리를 구현하는 방법

Laravel에서 시스템 간 및 도메인 간 권한 관리를 구현하는 방법

PHPz
PHPz원래의
2023-11-02 17:02:091013검색

Laravel에서 시스템 간 및 도메인 간 권한 관리를 구현하는 방법

Laravel은 널리 사용되는 PHP 프레임워크로서 풍부한 기능과 탁월한 확장 시스템을 갖추고 있습니다. 권한 관리 구현 측면에서 Laravel은 시스템에서 다양한 권한 관련 기능을 쉽게 구현할 수 있는 풍부한 지원도 제공합니다. 그러나 실제 애플리케이션에서는 여러 시스템 간의 권한 관리나 크로스 도메인 권한 확인이 포함될 수 있습니다. 이 경우 Laravel의 크로스 시스템 및 크로스 도메인 권한 관리 기능을 사용해야 합니다.

이 글에서는 주로 다음 내용을 포함하여 Laravel에서 시스템 간 및 도메인 간 권한 관리를 구현하는 방법을 소개합니다.

  1. Laravel에서 권한 관리에 대한 기본 지식
  2. 시스템 간 권한 관리를 구현하는 방법
  3. 방법 크로스 도메인 권한 구현 검증
  4. Laravel의 권한 관리에 대한 기본 지식

Laravel에서는 Laravel 자체 인증 시스템을 통해 권한 관리를 구현할 수 있습니다. 인증 시스템은 사용자 인증, 권한 부여, 비밀번호 재설정과 같은 기능을 제공합니다. 인증 기능은 주로 Gate 및 Policy 클래스를 통해 구현됩니다.

Gate는 Laravel에서 인증을 구현하는 핵심 클래스입니다. 이를 사용하여 사용자 권한을 정의하고 결정할 수 있습니다. Laravel에서는 app/Providers/AuthServiceProvider.php 파일에 Gate를 정의할 수 있습니다:

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

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

위의 예에서는 현재 사용자에게 기사 수정 권한이 있는지 확인하기 위해 "update-post"라는 Gate를 정의합니다. 판단 조건은 현재 사용자의 ID가 해당 글의 작성자 ID와 동일하다는 것입니다.

Gate를 사용하여 권한을 결정할 때 승인 방법을 직접 사용할 수 있습니다:

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

    //...
}

이때 현재 사용자에게 기사 수정 권한이 없으면 403 예외가 발생합니다. 예외 정보를 맞춤 설정해야 하는 경우 다음과 같이 텍스트의 세 번째 매개 변수를 전달할 수 있습니다.

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

이때 현재 사용자에게 기사 수정 권한이 없으면 403 예외가 발생합니다. 예외 메시지는 "수정 권한이 없습니다." 이 문서입니다.

위의 예에서는 권한 결정을 위해 $post 객체의 직접 전송을 사용했습니다. 물론, 권한 판단을 위해 다른 매개변수를 전달해야 하는 경우 세 번째 매개변수를 통해 추가 데이터를 배열 형태로 전달할 수도 있습니다.

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

Gate에서 판단할 때 두 번째 매개변수를 통해 전달된 데이터를 얻을 수 있습니다.

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

Except Gate 외에도 Laravel은 인증을 구현하는 데 사용할 수 있는 Policy라는 또 다른 클래스도 제공합니다. 이에 비해 Policy는 더 유연하며 can이라는 공개 메소드를 정의하여 개발자가 보다 세분화된 권한 제어를 구현할 수 있도록 해줍니다.

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

이 때 권한 판단을 위해 Gate를 사용할 때 Associate Gate 및 Associate Gate 정책 메소드를 사용할 수 있습니다. 정책:

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

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

위의 예에서는 정책 메소드를 통해 Gate 및 PostPolicy 클래스를 연결하므로 권한 부여 메소드를 사용할 때 Laravel은 자동으로 PostPolicy의 canUpdate 메소드를 호출하여 권한을 결정합니다. 이때 현재 사용자에게 기사 수정 권한이 없으면 403 예외가 발생합니다.

  1. 시스템 간 권한 관리 구현 방법

실제 애플리케이션에서는 한 시스템에서 다른 시스템으로 인증 정보를 전송해야 할 수도 있습니다. 예를 들어, 시스템 A에서 인증 및 권한 부여를 완료하면 이제 시스템 B에서 작업을 수행해야 하지만 사용자가 다시 인증하고 권한을 부여할 필요는 없습니다. 이때 원활한 권한 관리를 위해 시스템 A의 인증 정보를 시스템 B로 전송할 수 있습니다.

Laravel에서는 JWT(JSON Web Token)를 사용하여 시스템 간 권한 관리를 달성할 수 있습니다. JWT는 네트워크 환경에서 정보를 안전하게 전송하기 위한 개방형 표준입니다. 인터넷을 통해 JSON 기반 정보를 안전하게 전송하는 방법을 지정합니다. JWT는 헤더, 페이로드, 서명이라는 세 부분으로 구성됩니다. 이 중 헤더와 페이로드는 Base64를 사용해 인코딩된 JSON 문자열이고, 서명은 HS256과 같은 암호화 알고리즘을 사용해 헤더, 페이로드, 시크릿에서 생성된 해시 값이다.

Laravel에서는 tymon/jwt-auth 확장 패키지를 사용하여 JWT를 생성하고 구문 분석할 수 있습니다. 먼저 tymon/jwt-auth 확장 패키지를 설치해야 합니다.

composer require tymon/jwt-auth

설치가 완료된 후 JWT의 몇 가지 기본 구성을 수행해야 합니다. config/jwt.php 파일에서 구성할 수 있으며 주로 다음을 포함합니다.

  • secret: 암호화 키
  • ttl: 토큰 유효 기간(분)
  • providers: 사용자 공급자, 사용자 신원 확인에 사용
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'],
        ],
    ],

    // ...
];

After 구성을 완료하면 한 시스템에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.