当我想要进行多角色登录时遇到问题,我还使用 Spatie\Permission 并在用户模型上实现 HasRoles,如下所示
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable, HasRoles;
这是我要点击的API,所以我需要传递不记名令牌才能访问/pendaftar
Route::middleware(['auth:sanctum', 'role:user'])->group(function () {
Route::post('pendaftar', [PendaftarController::class, 'store']);
});
我也有
RoleMiddleware.php
这个后续功能
public function handle(Request $request, Closure $next, ...$permissions)
{
foreach($permissions as $permission){
if (!$request->user()->hasPermission($permission)){
return redirect()->back();
}
}
return $next($request);
}
在 kernel.php 中,我在 $middlewareGroup 数组下进行了一些配置,即
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
'role' => \App\Http\Middleware\RoleMiddleware::class,
以及 $middlewareAliases 中的更多配置
protected $middlewareAliases = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'auth' => \App\Http\Middleware\Authenticate::class,
'role' => \App\Http\Middleware\RoleMiddleware::class,
];
但是当我想点击
/pendaftar
时,邮递员会调用错误,(我还实现了accept = application/json)
"message": "Call to undefined method App\\Models\\User::hasPermission()",
我希望我可以在没有这些问题的情况下点击
/pendaftar
,
我传递的令牌是从 '''/login``` api 获取的。它的返回 json 响应如下
{
"access_token": "5|thGZw3dQBPNWtvyMPsUPoUzo4Zgt4MjPWxNWMRHU322b0537",
"token_type": "Bearer",
"role": "user"
}
您也应该使用以下特征:
use HasPermissions;
所以你的模型看起来像:
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable, HasRoles, HasPermissions;