调用未定义的方法 User::hasPermission()

问题描述 投票:0回答:1

当我想要进行多角色登录时遇到问题,我还使用 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"
}
php laravel-10 laravel-sanctum
1个回答
0
投票

您也应该使用以下特征:

    use HasPermissions;

所以你的模型看起来像:


class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, HasRoles, HasPermissions;


© www.soinside.com 2019 - 2024. All rights reserved.