Laravel은 널리 사용되는 PHP 프레임워크로서 풍부한 기능과 탁월한 확장 시스템을 갖추고 있습니다. 권한 관리 구현 측면에서 Laravel은 시스템에서 다양한 권한 관련 기능을 쉽게 구현할 수 있는 풍부한 지원도 제공합니다. 그러나 실제 애플리케이션에서는 여러 시스템 간의 권한 관리나 크로스 도메인 권한 확인이 포함될 수 있습니다. 이 경우 Laravel의 크로스 시스템 및 크로스 도메인 권한 관리 기능을 사용해야 합니다.
이 글에서는 주로 다음 내용을 포함하여 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 예외가 발생합니다.
실제 애플리케이션에서는 한 시스템에서 다른 시스템으로 인증 정보를 전송해야 할 수도 있습니다. 예를 들어, 시스템 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 파일에서 구성할 수 있으며 주로 다음을 포함합니다.
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协议进行通信。
在实际应用中,由于系统之间的跨域限制,可能会导致无法直接进行权限验证。此时,我们可以使用跨域资源共享(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!