Как проверить разрешения пользователя с помощью пользовательского промежуточного программного обеспечения в Laravel - PullRequest
0 голосов
/ 03 июля 2018

Я занимаюсь разработкой системы ACL Laravel. Мои базовые таблицы users,roles,permissions, а сводные таблицы role_user,role_permission,user_permission.

Я хочу проверить права доступа пользователя, используя мое пользовательское промежуточное ПО HasPermission. Я пробовал этот способ, но он не работает должным образом. каждый пользователь может получить доступ ко всем разрешениям, которые имеют или не имеют.

Теперь, как я могу решить проблему. Пожалуйста, смотрите мой пример кода.

Мой контроллер.

function __construct()
{
    $this->middleware('auth');
    $this->middleware('HasPermission:Role_Read|Role_Update|Role_Delete');
}

Мое промежуточное ПО.

class HasPermission
{

public function handle($request, Closure $next,$permissions)
{

    $permissions_array = explode('|', $permissions);
    // $user = $this->auth->user();
    foreach($permissions_array as $permission){
        if(!$request->user()->hasPermission($permission)){
            return $next($request);
        }
    }

    return redirect()->back();

 }
}

и, мой User Модельный метод.

public function user_permissions()
{
    return $this->belongsToMany(Permission::class,'user_permission');
}

public function hasPermission(string $permission)
{
    if($this->user_permissions()->where('name', $permission)->first())
    {
        return true;
    }
    else
    {
        return false;
    }

}

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

В основном !$request->user()->hasPermission($permission) говорит, что если пользователь, связанный с запросом, не имеет этого разрешения, которое передает промежуточное программное обеспечение, однако это не то, что вам нужно. Вот что вы должны сделать:

Если вам нужно, чтобы у пользователя было одно из указанных разрешений, которые вам необходимо сделать:

class HasPermission
{

    public function handle($request, Closure $next,$permissions)
    {

        $permissions_array = explode('|', $permissions);
        foreach($permissions_array as $permission){
            if ($request->user()->hasPermission($permission)){
                return $next($request);
            }
        }    
       return redirect()->back();    
    }
}

Если вы хотите, чтобы у пользователя были все заявленные разрешения, вам нужно сделать:

class HasPermission
{

    public function handle($request, Closure $next,$permissions)
    {

        $permissions_array = explode('|', $permissions);
        foreach($permissions_array as $permission){
            if (!$request->user()->hasPermission($permission)){
                return redirect()->back();                        
            }
        }    
        return $next($request);
    }
}

В качестве дополнительной заметки, если вы хотите сделать это более элегантным способом, вы можете сделать:

class HasPermission
{

    public function handle($request, Closure $next, ...$permissions_array)
    {    
       //Function body from above without the explode part
    }
}

И

function __construct()
{
   $this->middleware('auth');
   $this->middleware('HasPermission:Role_Read,Role_Update,Role_Delete');
}

Если вы используете запятые, то фреймворк разделит строку на аргументы для вас.

0 голосов
/ 03 июля 2018

В моем случае я просто добавил простую функцию для получения разрешений из базы данных и затем проверил ее Middleware. Проверьте этот код:

// Добавить новую функцию для получения разрешений из базы данных

public static function user_permissions($user) {

$permissions=DB::table('permissions')->where('user_id', $user)->first();
return $permissions; 

}

// В Middleware проверьте ваши разрешения

   if(Auth::guest())
    {
        return redirect('/');
    }

elseif(Functions::user_permissions(Auth::user()->id)->user_managment != 1) {

 return redirect('/');

} else {
    return $next($request);
}
0 голосов
/ 03 июля 2018

Лучший способ сделать это - ввести нового поставщика услуг и проверить права доступа и разрешения.

Я сделал тестовый проект (в прошлом году) для разрешения, управляемого БД, и использовал поставщика услуг.

Это идеальный способ реализации.

...