Как защитить маршруты API от пользователей, не являющихся администраторами, с помощью Laravel и jwt-auth

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

Недавно мне удалось реализовать токен-аутентификацию в моем Laravel API с помощью jwt-auth.

Я могу защитить свои маршруты API с помощью промежуточного программного обеспечения jwt-auth, чтобы гарантировать, что конкретный пользователь получил токен (вошел в систему).

  Route::group(['middleware' => ['jwt.auth']], function() {

  // List Books
  Route::get('books', 'BookController@index');

  )};

JWT создается в контроллере с именем APILoginController, который я создал, содержащий:

    public function login(Request $request)
{

    // check the users credentials
    $credentials = $request->only('email', 'password');
    try {
        if (! $token = JWTAuth::attempt($credentials)) {
            return response()->json(['error' => 'Invalid Credentials'], 401);
        }
    } catch (JWTException $e) {
        return response()->json(['error' => 'could_not_create_token'], 500);
    }
    // the users credentials are correct - return web token
    $user = Auth::user();

    return response()->json(compact('token', 'user')) ;
}

Я добавил поле is_admin в свою пользовательскую таблицу

  Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('is_admin');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

я надеялся, что смогу использовать это поле для защиты определенных маршрутов от обычного пользователя, где is_admin = 0, и разрешить доступ к ним только администраторам (is_admin = 1). Я понятия не имею, правильный ли это способ сделать это, но это казалось самым простым.

Любая помощь или руководство будут БОЛЬШИМ образом оценены, поскольку я боролся с этим в течение достаточно долгого времени. Большинство руководств, с которыми я сталкиваюсь, похоже, создают еще одну таблицу с ролями, но это кажется немного излишним и сложным для моего уровня навыков и приложения, которое я пытаюсь создать.

С уважением, Мэтью


person Matthew Dejager    schedule 21.03.2018    source источник


Ответы (2)


Что вам нужно сделать, так это написать собственное промежуточное программное обеспечение, которое проверяет, является ли пользователь администратором или нет.

php artisan make:middleware checkAdmin

Эта команда поместит новый класс CheckAdmin в ваш каталог app/Http/Middleware.

<?php

namespace App\Http\Middleware;

use Closure;

class checkAdmin
{

      public function handle($request, Closure $next)
      {

           //get admin value of user from database

           if ($adminValue != 1) {
               return redirect('home');
           }

           return $next($request);
     }

}

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

Route::get('admin/profile', function () {
   //
})->middleware(CheckAdmin::class);

Подробнее о промежуточном программном обеспечении в Laravel см. в документации https://laravel.com/docs/5.6/middleware

person Ivan of uganda    schedule 21.03.2018

Я обычно использую Passport, который поставляется с Laravel, но я думаю, что он очень похож.

Вы можете либо создать собственный промежуточный узел, который будет проверять, какой пользователь пытается получить доступ к конечной точке. В вашем случае он проверит, является ли пользователь is_admin => 1. У вас будет что-то вроде этого:

Route::group(['middleware' => ['jwt.auth', 'is_admin']], function() {

Другой вариант — определить область действия вашего токена, когда пользователь впервые запросит его. Я не знаю, возможно ли это с jwt-auth, но тогда у вас будет что-то вроде этого:

->middleware('scopes:admin');

Надеюсь, это помогло!

person Cedric Toupin    schedule 21.03.2018