Я создаю несколько разрешений и ролей для своего проекта laravel.
в маршруте web.php я могу определить подобное промежуточное ПО с некоторыми разрешениями:
$can = ['can:manage_global,manage_users,create_users'];
$this->get('/create', 'UserController@create')->middleware($can);
или в клинке с одним разрешением:
@can('manage_global')
...
@endcan
Как я могу проверить несколько значений разрешений в линии блейд-сервера и контроллера web.php?
@ Роман Бобрик, спасибо. как насчет контроллера?
если я правильно вас понял, попробуйте laravel.com/docs/5.7/controllers#controller-middleware
Вы пытаетесь проверить множественные разрешения в своем файле лезвия И в своем контроллере, как вы можете в своих веб-маршрутах? Я это понимаю? (Кроме того, какую версию Laravel вы используете?)






Вы можете написать промежуточное ПО.
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
Если вы пытаетесь проверить, может ли пользователь получить доступ к каким-либо из ваших определенных шлюзов из контроллера, вы можете взять очередь из существующего Авторитетная черта и добавить некоторые дополнительные функции в свой собственный трейт.
<?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
}
}
проверьте это stackoverflow.com/questions/34188461/…