Laravel / как проверить разрешения в blade-сервере и контроллере?

Я создаю несколько разрешений и ролей для своего проекта laravel.

в маршруте web.php я могу определить подобное промежуточное ПО с некоторыми разрешениями:

$can = ['can:manage_global,manage_users,create_users'];
$this->get('/create', 'UserController@create')->middleware($can);

или в клинке с одним разрешением:

@can('manage_global')
   ...
@endcan

Как я могу проверить несколько значений разрешений в линии блейд-сервера и контроллера web.php?

проверьте это stackoverflow.com/questions/34188461/…

Roman Meyer 05.12.2018 14:56

@ Роман Бобрик, спасибо. как насчет контроллера?

Areza 05.12.2018 15:11

если я правильно вас понял, попробуйте laravel.com/docs/5.7/controllers#controller-middleware

Roman Meyer 05.12.2018 15:27

Вы пытаетесь проверить множественные разрешения в своем файле лезвия И в своем контроллере, как вы можете в своих веб-маршрутах? Я это понимаю? (Кроме того, какую версию Laravel вы используете?)

Jim Rubenstein 05.12.2018 16:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
4
5 149
2

Ответы 2

Вы можете написать промежуточное ПО.

class CanAnyMiddleware
{
    public function handle($request, Closure $next, $permissions)
    {
        foreach ($permissions as $permission) {
            if ( $request->user()->can($permission)) {
                return $next($request); // allow
            }
        }

        return redirect(route('home')); // deny
    }
}

И используйте его в строке маршрута.

Route::get('/create', 'UserController@create')
    ->middleware('canAny:manage_global,manage_users,create_users');

А начиная с Laravel 5.6 вы можете использовать @canany в Blade:

@canany(['manage_global', 'manage_users', 'create_users'])
    ...
@endcanany

https://github.com/laravel/framework/pull/24137

Если вы пытаетесь проверить, может ли пользователь получить доступ к каким-либо из ваших определенных шлюзов из контроллера, вы можете взять очередь из существующего Авторитетная черта и добавить некоторые дополнительные функции в свой собственный трейт.

<?php

namespace App\Traits\MyAuthorizable;

use Illuminate\Contracts\Auth\Access\Gate;

trait MyAuthorizable {
  public function canAny(array $abilities, $arguments = []) {
    return collect($abilities)->reduce(function($canAccess, $ability) use ($arguments) {
      // if this user has access to any of the previously checked abilities, or the current ability, return true
      return $canAccess || app(Gate::class)->forUser($this)->check($ability, $arguments);
    }, false);
  }

  public function canAll(array $abilities, $arguments = []) {
    return collect($abilities)->reduce(function($canAccess, $ability) use ($arguments) {
      // if this user has access to _all_ of the previously checked abilities, _and_ the current ability, return true
      return $canAccess && app(Gate::class)->forUser($this)->check($ability, $arguments);
    }, true);
  }
}

Затем вы можете добавить эту черту в свой пользовательский класс с помощью use App\ MyAuthorizable; в определении вашего пользовательского класса.

Это откроет методы canAny и canAll для вашего пользователя, к которым вы затем сможете получить доступ с вашего контроллера.

<?php

public function get($request) {
    $User = Auth::User();

    if ($User->canAll(['manage_global', 'manage_users', 'create_users'])) {
        // user can do all of the things
    } elseif ($User->canAny(['manage_global', 'manage_users', 'create_users']) {
        // user can only do _some_ of the things
    } else {
        // user can do _none_ of the things
    }
}

Другие вопросы по теме