تالار گفتمان nCIS.ir

نسخه‌ی کامل: RBAC در لاراول (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام خدمت همه
بالاخره بعد از search ها در اینترنت فهمدیم باید چطوری role درست کرده و به کاربر نسبت دهم
اما توی قسمت بعدش موندم . لطفا راهنمایی کنید
مشکل کدی ندارم . نمیدونم چطور باید استفاده کنم
این کدمه
    public function isEmployee(){
       return ($this->roles()->count() ? true : false);
   }
   public function hasRole($role)
   {
       return $this->roles->pluck("name")->contains($role);
   }
   private function getIdInArray($array , $term)
   {
       foreach ($array as  $key => $val )
       {
           if($val == $term)
           {
               return $key;
           }
       }
       throw new UnexpectedValueException;
   }
   public function makeEmployee($title)
   {
       $assigned_roles = [];
       $roles = Role::all()->pluck("name","id");

       switch ($title)
       {
           case 'super_admin':
               $assigned_roles[] = $this->getIdInArray($roles , 'create');
               $assigned_roles[] = $this->getIdInArray($roles , 'update');
           case 'admin':
               $assigned_roles[] = $this->getIdInArray($roles , 'delete');
               $assigned_roles[] = $this->getIdInArray($roles , 'edit');
           case 'user':
               $assigned_roles[] = $this->getIdInArray($roles , 'read');
               $assigned_roles[] = $this->getIdInArray($roles , 'lemons');
               break;
           default :
               throw new Exception("The Employee status does not Exist");
       }
       $this->roles()->sync($assigned_roles);
   }
}
حالا چطور داخل کنترلری که میخوام پست ایجاد کنم این role رو بذارم چون من نه از Gate استفاده کردم نه از policy
سلام به همه دوستان
بنده داخل یوتوب جواب سوالم رو پیدا کردم گفتم باهاتون به اشتراک بذارم
برای اینکار باید از middleware استفاده کنید
پس یک middleware با نام CheckRole میسازیم با این محتوا
    public function handle($request, Closure $next)
   {
       if($request->user() === null) {
           return response("first login", 401);
       }
       $action = $request->route()->getAction();
       $roles = isset($action['roles']) ? $action['roles'] : null;
       foreach ($roles as $key=>$val)
       {
           $myrole = $val;
       }
       if($request->user()->hasRole($myrole) || !$roles) {
           return $next($request);
       }
      return response("you can not access");
   }

 
و در قسمت route
Route::post('/cards/add',[
    'uses'=>'CardsController@create',
   'middleware' => 'roles',
   'roles' => ['create'],
]);

و الان درست کار میکند
توضیح :
منظور از getAction() در
$action = $request->route()->getAction();
همان 'middleware' , 'roles' , 'uses' هست