【问题标题】:Jwt with multiple model具有多个模型的 Jwt
【发布时间】:2017-01-14 18:58:23
【问题描述】:

我使用带有 jwt 的 Lavarel 5.2 框架进行授权
jwt 仅使用一种模型获取用户信息表单令牌, 现在如何在多个模型上使用 jwt 解析用户令牌?
例如,当我在 api jwt 中使用客户令牌从客户模型中解析该令牌时,默认守卫应该是客户
auth.php

'defaults' => [
    'guard' => 'operator',
    'passwords' => 'operators',
],

'guards' => [
    'operator' => [
        'driver' => 'session',
        'provider' => 'operators',
    ],
    'customer' => [
        'driver' => 'session',
        'provider' => 'customers',
    ],
    'biker' => [
        'driver' => 'session',
        'provider' => 'bikers',
    ]
],

'providers' => [
    'operators' => [
        'driver' => 'eloquent',
        'model' => App\Http\Services\Auth\Model\User::class,
    ],
    'customers' => [
        'driver' => 'eloquent',
        'model' => App\Http\Aggregate\Customer\Model\Customer::class,
    ],
    'bikers' => [
        'driver' => 'eloquent',
        'model' => App\Http\Aggregate\Biker\Model\Biker::class,
    ]
],

【问题讨论】:

  • 请朋友们帮帮我
  • 你的问题很不清楚。考虑一下如何将其改写为人们可以帮助您的内容。
  • 现在我想清楚了
  • 感谢分数的朋友,但我希望你能帮助我解决这个问题:)

标签: php laravel laravel-5.2 jwt


【解决方案1】:

兼容 Laravel 8

对于仍在寻找干净解决方案的其他人:

我建议在 config/auth.php 中手动配置提供程序和守卫,不要以编程方式更改任何提供程序。

接下来要确保使用正确的 JWTSubject 身份验证模型,是为一组只能访问的路由创建不同的中间件(不要忘记在 Kernel.php 中的$routeMiddleware 下指定它)通过特定的守卫/身份验证模型。然后,对于 Manager 模型,中间件句柄函数可能如下所示:

public function handle(Request $request, Closure $next) {
    if (!($request->user('managers'))) abort(401);

    Auth::shouldUse('managers');

    return $next($request);
}

然后为 Employee 模型创建另一个中间件,并将 'managers' 保护值更改为您在 config/auth.php 中配置的 'employees'。

在您的 routes/api.php 中,您可以使用(例如)指定路由组:

Route::group(['middleware' => 'management'], function() { });

为了使这一切正常工作,请在调用 auth()->attempt() 函数时指定保护,例如auth('managers')->attempt($credentials)).

【讨论】:

    【解决方案2】:

    这是我的解决方案。在 Laravel 6 上测试

    用户模型

    namespace App;
    
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Database\Eloquent\SoftDeletes;
    use Tymon\JWTAuth\Contracts\JWTSubject;
    
    class User extends Authenticatable implements JWTSubject
    {
        use SoftDeletes;
        use Notifiable;
    
        public $incrementing = false;
        protected $keyType = 'string';
    
        protected $fillable =
        [
        
        ];
    
        protected $hidden =
        [
            'password',
            'created_at',
            'updated_at',
            'deleted_at'
        ];
    
        public function getJWTIdentifier()
        {
            return $this->getKey();
        }
    
        public function getJWTCustomClaims()
        {
          
        }
    }
    

    教师模型

    namespace App;
    
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Database\Eloquent\SoftDeletes;
    use Tymon\JWTAuth\Contracts\JWTSubject;
    
    class Teacher extends Authenticatable implements JWTSubject
    {
        use SoftDeletes;
        use Notifiable;
    
        public $incrementing = false;
        protected $keyType = 'string';
    
        protected $fillable =
        [
           
        ];
    
        protected $hidden =
        [
            'password',
            'oldpassword',
            'created_at',
            'updated_at',
            'deleted_at'
        ];
    
        public function getJWTIdentifier()
        {
            return $this->getKey();
        }
    
        public function getJWTCustomClaims()
        {
           
        }
    }
    

    配置/auth.php

    'defaults' => [
            'guard' => 'api',
            'passwords' => 'users',
        ],
    'guards' => [
            'web' => [
                'driver' => 'session',
                'provider' => 'users',
            ],
            'api' => [
                'driver' => 'jwt',
                'provider' => 'users'
            ],
            'teacher-api' => [
                'driver' => 'jwt',
                'provider' => 'teachers'
            ],
        ],
    

    AuthController 功能:

       if (
            $request->getRequestUri() ===
            'OTHER_AUTH_ROUTE'
        ) {
            $credentials = $request->only('username', 'password']);
            $token = Auth::shouldUse('teacher-api');
            $token = Auth::attempt($credentials);
            if (!$token) {
                return response()->json(['error' => 'Unauthorized'], 401);
            }
            return $this->respondWithToken($token);
        }
        $credentials = $request->only([USERNAME, 'password']);
        $token = Auth::attempt($credentials);
        if (!$token) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
        return $this->respondWithToken($token);
    

    希望对大家有所帮助

    【讨论】:

      【解决方案3】:

      您可以在每个控制器中更改__construct 函数,如下所示。以便 jwt 知道要验证哪个模型。

      自行车控制器

      function __construct()
      {
          Config::set('jwt.user', Biker::class);
          Config::set('auth.providers', ['users' => [
                  'driver' => 'eloquent',
                  'model' => Biker::class,
              ]]);
      }
      

      客户控制器

      function __construct()
      {
          Config::set('jwt.user', Customer::class);
          Config::set('auth.providers', ['users' => [
                  'driver' => 'eloquent',
                  'model' => Customer::class,
              ]]);
      }
      

      【讨论】:

        【解决方案4】:

        您可以创建一个单独的中间件,例如 AuthModel。您可以设置配置以采用如下提供者,

        Config::set('auth.providers.users.model',\App\Models\Customer::class);
        

        如果要使用多个模型,则需要使用 if 条件来检查哪个 url 可以访问哪些模型。可以这样,

        if(url == '/customer/api/') {
         Config::set('auth.providers.users.model',\App\Models\Customer::class);
        } else if(url == '/biker/api/') {
         Config::set('auth.providers.users.model',\App\Models\Biker::class);
        }
        

        在上面的例子中,我只是使用了url作为例子,所以从请求中获取它。

        【讨论】:

        • 您好,请您查看与您的答案相关的这个问题并告诉我您对此有何看法Here
        猜你喜欢
        • 2021-06-05
        • 2016-09-06
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        相关资源
        最近更新 更多