Как защитить маршруты 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). Я понятия не имею, если это правильный путь, но это казалось самым простым.

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

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

1

Решение

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

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

0

Другие решения

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

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

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

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

->middleware('scopes:admin');

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

1

По вопросам рекламы [email protected]