laravel/ как проверить разрешения в блейде и контроллере?
Я создаю некоторые разрешения и роли для моего проекта laravel.
в web.php
маршрут, я могу определить промежуточное программное обеспечение, как это с некоторыми разрешениями:
$can = ['can:manage_global,manage_users,create_users'];
$this->get('/create', 'UserController@create')->middleware($can);
или в клинке с одним разрешением:
@can('manage_global')
...
@endcan
Как я могу проверить несколько значений разрешений в блейд-контроллере? web.php
?
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
в клинке:
@canany(['manage_global', 'manage_users', 'create_users'])
...
@endcanany
Если вы пытаетесь проверить, может ли пользователь получить доступ к любому из ваших определенных шлюзов, из контроллера, вы можете взять очередь из существующей черты Authorizable и добавить некоторые дополнительные функции в свою собственную черту.
<?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
}
}