如何使用Laravel和jwt-auth保护非管理员用户的api路由

时间:2018-03-21 11:20:07

标签: php laravel authentication jwt-auth

我是Laravel和Stackoverflow的新手,所以如果我的问题格式不正确,我会道歉。关于此的任何提示将不胜感激。

我最近设法使用jwt-auth。

在我的Laravel API上实现了令牌认证

我可以使用jwt-auth中间件保护我的api路由,以确保特定用户已收到令牌(已登录)。

  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)访问它们。我不知道这是否是正确的方法,但它似乎是最简单的。

任何帮助或指导都会非常感激,因为我一直在努力解决这个问题。我遇到的大多数教程似乎都创建了另一个带有角色的表格,但这似乎有点过分和复杂,因为我的技能水平和我想要创建的应用程序。

亲切的问候, 马修

2 个答案:

答案 0 :(得分:1)

我通常使用Laravel附带的Passport,但我认为它非常相似。

您可以创建自定义中间件,以验证尝试访问端点的用户类型。在您的情况下,它将验证用户是否是is_admin =>你会有这样的事情:

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

您的另一个选择是在用户首次请求时为您的令牌定义范围。我不知道jwt-auth是否可行,但你会有这样的事情:

->middleware('scopes:admin');

希望有所帮助!

答案 1 :(得分:0)

您需要做的是编写自己的中间件来检查用户是否是管理员

php artisan make:middleware checkAdmin

此命令将在您的app / Http / Middleware目录中放置一个新的CheckAdmin类

<?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