Я новичок в 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). Я понятия не имею, если это правильный путь, но это казалось самым простым.
Буду признателен за любую помощь или руководство, так как я боролся с этим в течение достаточно долгого времени. Большинство учебных пособий, с которыми я сталкиваюсь, похоже, создают другую таблицу с ролями, но это кажется излишним и сложным для моего уровня квалификации и приложения, которое я пытаюсь создать.
С уважением,
Мэтью
Что вам нужно сделать, это написать свое собственное промежуточное программное обеспечение, которое проверяет, является ли пользователь администратором или нет
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
Я обычно использую Паспорт, который идет с Laravel, но я думаю, что он довольно похож.
Вы можете создать пользовательское промежуточное звено, которое будет проверять, какой пользователь пытается получить доступ к конечной точке. В вашем случае он проверит, является ли пользователь is_admin => 1. У вас будет что-то вроде этого:
Route::group(['middleware' => ['jwt.auth', 'is_admin']], function() {
Другим вариантом будет определение области действия вашего токена при первом запросе пользователем. Я не знаю, возможно ли это с jwt-auth, но тогда у вас будет что-то вроде этого:
->middleware('scopes:admin');
Надеюсь, что это помогло!