Я работаю над приложением панели управления, где у меня есть несколько пользовательских ролей, таких как globaladmin, редакторы и т. Д. Теперь я хочу использовать эти роли с одним ресурсом UserController.
Например, globaladmins должен иметь возможность выполнять все методы Restful, тогда как редактор может только просматривать и обновлять пользователя.
Я знаю, что вверение приходит с промежуточным программным обеспечением из коробки, которая идеально подходит для того, что мне нужно. Но это работает только на маршрутах (в этом случае мне понадобится отдельный контроллер для каждой роли) .
Мой UserController выглядит примерно так.
Class UserController extends BaseController
{
$protected $viewfolder;
public function __construct
{
// Checking for role and then assigning the folder name of the views
$role = User::getRole();
switch($role)
case 'globaladmin':
$this->viewfolder = 'globaladmin';
break;
case 'editor':
$this->viewfolder = 'editor';
break;
default:
abort(401, 'Access Denied');
break;
}
public function index(){
if( Entrust::can('view-all-users') ){
$users = User:all();
}
return view( $this->viewfolder.'.users.viewuser', compact('users'));
}
public function create()
public function update()
public function delete()
}
Мне нужно промежуточное программное обеспечение в конструкторе, которое будет проверять роль пользователя, а затем разрешать использовать метод только в том случае, если роль имеет разрешение на его использование. Но это должно быть сделано достойным образом без каких-либо взломов, потому что я буду использовать его и на других контроллерах.
Я предполагаю, что вы используете следующее в вашем файле маршрутов:
Route::resource('users', 'UserController');
В этом случае я бы предложил использовать одно из промежуточных программ, предоставляемых Entrust, в качестве базы и получить вызываемый метод, например, если вы используете EntrustRole:
public function handle($request, Closure $next)
{
$controllerMethod = Route::segment(3);
$roles = $this->retrieveRequiredRolesForMethod($method);
if ($this->auth->guest() || !$request->user()->hasRole(explode('|', $roles))) {
abort(403);
}
return $next($request);
}
Конечно, это всего лишь подсказка, и вы должны найти лучший способ извлечь вызываемый метод, и все же необходимо реализовать retrieveRequiredRolesForMethod
Ах .. Я думаю, что это будет работать в вашем случае.
class UserController extends Controller
{
public function __construct()
{
$this->middleware('permission:user_index', ['only' => ['index']]);
$this->middleware('permission:user_create', ['only' => ['create', 'store']]);
$this->middleware('permission:user_edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:user_delete', ['only' => ['delete']]);
$this->middleware('permission:user_view', ['only' => ['show']]);
}
}
Здесь user_index, user_create, user_edit и т. Д. — это разрешения (записи в поле имени таблицы разрешений) для пользовательского модуля.
Это автоматически проверит возможности авторизованного пользователя и отобразит страницу соответственно.