>  기사  >  PHP 프레임워크  >  Laravel에서 권한 관리 시스템을 구현하는 방법

Laravel에서 권한 관리 시스템을 구현하는 방법

WBOY
WBOY원래의
2023-11-02 16:51:331053검색

Laravel에서 권한 관리 시스템을 구현하는 방법

Laravel에서 권한 관리 시스템을 구현하는 방법

소개:
웹 애플리케이션의 지속적인 개발로 인해 권한 관리 시스템은 많은 애플리케이션의 기본 기능 중 하나가 되었습니다. 널리 사용되는 PHP 프레임워크인 Laravel은 권한 관리 시스템을 구현하기 위한 풍부한 도구와 기능을 제공합니다. 이 글에서는 Laravel에서 간단하고 강력한 권한 관리 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

1. 권한 관리 시스템 설계 아이디어
권한 관리 시스템을 설계할 때 다음 핵심 사항을 고려해야 합니다.

  1. 역할 및 권한 정의: 역할은 사용자의 기능 또는 ID를 나타내며 권한은 시스템에 대한 사용자의 제어 기능이나 리소스에 대한 액세스입니다.
  2. 사용자와 역할 사이의 관계: 사용자는 여러 역할을 가질 수 있으며 역할은 여러 사용자가 소유할 수 있습니다.
  3. 권한과 역할의 관계: 역할은 여러 권한을 가질 수 있으며 하나의 권한은 여러 역할이 소유할 수 있습니다.
  4. 라우팅과 권한의 관계: 라우팅은 사용자가 시스템 기능에 액세스할 수 있는 입구를 결정합니다. 경로에 따라 액세스를 제한하기 위해 다른 권한이 필요할 수 있습니다.

위의 디자인 아이디어를 바탕으로 Laravel에서 권한 관리 시스템 구현을 시작할 수 있습니다.

2. 데이터베이스 설계 및 마이그레이션
Laravel에서는 데이터베이스 마이그레이션을 사용하여 데이터베이스 테이블을 생성하고 수정할 수 있습니다. 다음은 간단한 데이터베이스 설계입니다.

  1. Users 테이블(users): 사용자 이름, 비밀번호 등 사용자의 기본 정보를 저장합니다.
  2. 역할 테이블(roles): 역할 이름, 설명 등 역할의 기본 정보를 저장합니다.
  3. 권한 테이블: 권한 이름, 설명 등 권한에 대한 기본 정보를 저장합니다.
  4. 역할-권한 연관 테이블(role_permission): 역할과 권한 간의 해당 관계를 기록합니다.
  5. 사용자-역할 연관 테이블(user_role): 사용자와 역할 간의 해당 관계를 기록합니다.

먼저 마이그레이션 파일을 생성합니다:

php artisan make:migration create_users_table
php artisan make:migration create_roles_table
php artisan make:migration create_permissions_table
php artisan make:migration create_role_permission_table
php artisan make:migration create_user_role_table

그런 다음 해당 마이그레이션 파일에 테이블 구조를 작성하고(코드는 생략됨) 마이그레이션 명령을 실행합니다:

php artisan migrate

Three 모델 관계 정의
Laravel에서, Eloquent 모델을 사용하여 데이터베이스 테이블 간의 관계를 정의할 수 있습니다. 먼저 사용자, 역할, 권한이라는 세 가지 모델을 정의해야 합니다.

  1. 사용자 모델(User)

    namespace App;
    
    use IlluminateDatabaseEloquentModel;
    
    class User extends Model
    {
     // 用户与角色的多对多关系
     public function roles()
     {
         return $this->belongsToMany('AppRole')->withTimestamps();
     }
    
     // 判断用户是否拥有某个角色
     public function hasRole($role)
     {
         if (is_string($role)) {
             return $this->roles->contains('name', $role);
         }
    
         return !! $role->intersect($this->roles)->count();
     }
    
     // 判断用户是否拥有某个权限
     public function hasPermission($permission)
     {
         return $this->hasRole($permission->roles);
     }
    }
  2. Role 모델(Role)

    namespace App;
    
    use IlluminateDatabaseEloquentModel;
    
    class Role extends Model
    {
     // 角色与用户的多对多关系
     public function users()
     {
         return $this->belongsToMany('AppUser')->withTimestamps();
     }
    
     // 角色与权限的多对多关系
     public function permissions()
     {
         return $this->belongsToMany('AppPermission')->withTimestamps();
     }
    
     // 判断角色是否拥有某个权限
     public function hasPermission($permission)
     {
         if (is_string($permission)) {
             return $this->permissions->contains('name', $permission);
         }
    
         return !! $permission->intersect($this->permissions)->count();
     }
    }
  3. 권한 모델(Permission)

    namespace App;
    
    use IlluminateDatabaseEloquentModel;
    
    class Permission extends Model
    {
     // 权限与角色的多对多关系
     public function roles()
     {
         return $this->belongsToMany('AppRole');
     }
    }

4. 미들웨어 및 라우팅 설정
권한 관리 시스템을 구현하기 위해, 미들웨어를 사용하여 사용자 액세스 요청을 가로채고 인증할 수 있습니다. 먼저 권한 미들웨어를 정의해야 합니다.

  1. 권한 미들웨어 정의:

    namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateSupportFacadesAuth;
    
    class CheckPermission
    {
     public function handle($request, Closure $next, $permission)
     {
         $user = Auth::user();
         
         if ($user && $user->hasPermission($permission)) {
             return $next($request);
         }
         
         return redirect()->route('403'); // 没有权限则跳转到403页面
     }
    }
  2. 권한 미들웨어 등록:
    appHttpKernel.php$routeMiddleware 배열에 권한 미들웨어 등록: appHttpKernel.php中的$routeMiddleware数组中注册权限中间件:

    protected $routeMiddleware = [
     // ...
     'permission' => AppHttpMiddlewareCheckPermission::class,
    ];
  3. 关联中间件与路由:
    routesweb.php中定义需要权限控制的路由,并使用permission

    Route::get('/members', 'MemberController@index')->middleware('permission:member_view');

미들웨어 및 라우팅 연결:

routesweb.php에서 권한 제어가 필요한 경로를 정의하고 permission 미들웨어 사용:

namespace AppHttpControllers;

use IlluminateSupportFacadesAuth;

class MemberController extends Controller
{
 public function index()
 {
    if (Auth::user()->hasPermission('member_view')) {
         return view('members.index');
    }
    
    // 没有权限则跳转到403页面
    return redirect()->route('403');
 }
}

  1. 5 컨트롤러에서. , 다음 코드 예제를 사용하여 사용자의 ID를 인증하고 권한에 따라 해당 뷰를 반환할 수 있습니다.

  2. 컨트롤러의 메소드:

    @if(Auth::user()->hasPermission('member_view'))
     <!-- 具有查看成员的权限,显示相关内容 -->
     <table>
         ...
     </table>
    @else
     <!-- 没有权限,显示无权限提示 -->
     <div>您没有查看成员的权限</div>
    @endif

뷰의 코드:

rrreee

6. 요약

위의 단계를 통해 우리는 Laravel에서 간단하고 강력한 권한 관리 시스템을 성공적으로 구현했습니다. 역할, 권한 및 해당 관계를 정의하고, 미들웨어를 사용하여 경로를 가로채고, 컨트롤러와 보기에서 권한을 판단함으로써 사용자 액세스 권한을 정밀하게 제어할 수 있습니다. 이 글이 Laravel의 권한 관리 기능을 더 잘 이해하고 적용하는 데 도움이 되기를 바랍니다.
  • 참고 자료:
  • Laravel 공식 문서(https://laravel.com/docs/8.x/)
🎜Laravel Beyond CRUD 시리즈 튜토리얼: 권한 관리(https://laravelbestpractices.com/series/show/ laravel -beyond-crud/에피소드/9)🎜🎜

위 내용은 Laravel에서 권한 관리 시스템을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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