Ограничить доступ к маршруту для пользователей без прав администратора

Цель

Я пытаюсь создать ограничение маршрута администратора для моих пользователей, вошедших в систему. Я попытался проверить, является ли мой пользователь log-in, а также является ли тип пользователя Admin, и если это так, я хочу разрешить им доступ к маршруту администратора, в противном случае ответьте 404.


маршруты.php

<!-- Route group -->
$router->group(['middleware' => 'auth'], function() {

    
    <!-- No Restriction -->
    Route::get('dashboard','WelcomeController@index');
   
    <!-- Admin Only -->
    if(Auth::check()){
        if ( Auth::user()->type == "Admin" ){

            //Report
            Route::get('report','ReportController@index');
            Route::get('report/create', array('as'=>'report.create', 'uses'=>'ReportController@create'));
            Route::post('report/store','ReportController@store');
            Route::get('report/{id}', array('before' =>'profile', 'uses'=>'ReportController@show'));
            Route::get('report/{id}/edit', 'ReportController@edit');
            Route::put('report/{id}/update', array('as'=>'report.update', 'uses'=>'ReportController@update'));
            Route::delete('report/{id}/destroy',array('as'=>'report.destroy', 'uses'=>'ReportController@destroy'));

        }
    }

});

Результат

Это не работает, как я хотел. Выдает ошибку 404 даже для пользователей с правами администратора.


person Tiffany Soun    schedule 04.06.2015    source источник
comment
Кэшируете ли вы свои маршруты?   -  person user1669496    schedule 04.06.2015


Ответы (2)


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

  1. Создайте промежуточное ПО:
php artisan make:middleware AdminMiddleware
namespace App\Http\Middleware;

use App\Article;
use Closure;
use Illuminate\Contracts\Auth\Guard;

class AdminMiddleware
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->getUser()->type !== "admin") {
            abort(403, 'Unauthorized action.');
        }

        return $next($request);
    }
}
  1. Добавьте его в app\Http\Kernel.php:
protected $routeMiddleware = [
    'admin' => 'App\Http\Middleware\AdminMiddleware',
];
  1. Используйте промежуточное ПО в своих маршрутах:
Route::group(['middleware' => ['auth', 'admin']], function() {
    // your routes
});
person Limon Monte    schedule 04.06.2015
comment
это было довольно быстро, я должен сказать! И идеальный ответ - person Khan Shahrukh; 04.06.2015
comment
Также более чистым подходом является размещение промежуточного программного обеспечения внутри конструктора вашего контроллера. Но это зависит от вас - person Harry Geo; 04.06.2015
comment
Если вы поместите промежуточное программное обеспечение в свой контроллер, вы столкнетесь с проблемой Guard, переданной в конструктор промежуточного программного обеспечения, поскольку $auth имеет нулевое пользовательское свойство, даже когда вы вошли в систему. \Auth::user() также имеет значение null в обоих случаях. конструктор и метод дескриптора созданного промежуточного программного обеспечения. Это заставило меня проверять доступ пользователя внутри каждого метода, вызываемого маршрутами, а не в конструкторе контроллера. Проблема с кэшированием маршрута будет решена в 99% случаев, но для полной безопасности, я думаю, необходима проверка внутри каждого метода. Немного боли, если кто-то знает лучший способ, дайте мне знать - person NULL pointer; 02.11.2018
comment
Я должен упомянуть, что включите промежуточное ПО в вашем контроллере, используя ключ промежуточного ПО, а не имя класса: $this-›middleware('admin'); здесь отсутствует шаг. Спасибо - person KTM; 31.07.2019

Этот ответ о том, почему ваш код не работает должным образом. Решение @limonte правильное и лучшее, что я могу придумать.

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

Таким образом, вы не должны размещать какой-либо код, который зависит от запроса (например, проверка наличия у пользователя достаточных прав для доступа к маршруту).

В частности, вы не должны использовать следующие модули, зависящие от запроса, внутри вашего route.php (не исчерпывающий):

  • Auth
  • DB или любые запросы к БД, которые могут зависеть от времени
  • Session
  • Request

Вы должны просматривать route.php как часть своей конфигурации, просто так получилось, что он написан непосредственно на php, а не на каком-то новом языке, который вам нужно выучить.

person edi9999    schedule 04.06.2015