Laravel Sanctum 可以使用 Multiauth 防护

Tho*_*mas 7 laravel laravel-sanctum

我正在使用 laravel sanctum 进行测试,但这里有一些问题.. 我正在创建管理员守卫。

在此处输入图片说明

当我将中间件更改为 auth:sanctum_admin .. 它应该只能由管理员访问,但在这里我可以使用普通用户帐户访问 web 守卫。我不知道为什么?...我使用带有多重身份验证包的护照。很好。但这里的密室不能将用户表和管理员分开。

小智 9

您也可以在密室中使用多个守卫。为此,请按照以下步骤操作 -

  1. 根据需要创建自己的守卫。(在config/auth.php)
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ]
    ],
Run Code Online (Sandbox Code Playgroud)
  1. 设置提供者。(在config/auth.php)
'providers' => [
       'users' => [
           'driver' => 'eloquent',
           'model' => App\User::class,
       ],

       'admins' => [
           'driver' => 'eloquent',
           'model' => App\Admin::class,
       ],
   ],
Run Code Online (Sandbox Code Playgroud)
  1. 当您对用户进行身份验证时使用此保护。(在路由文件中)
    if(auth()->guard('admin')->attempt($request->only('email','password')))
    {
        return auth()->guard('admin')->user();
    }
    
    Run Code Online (Sandbox Code Playgroud)


Har*_*rat 7

@Abhishek Mitra

为了授权使用 Laravel Sanctum 的情况Multiple Auth Guard,我们可以使用中间件

Route::middleware(['auth:guard_name'])->get('/user', function(){
    return auth()->guard('guard_name')->user();
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*aji 7

配置/auth.php

司机是圣所

'guards' => [
    'users' => [
        'driver' => 'sanctum',
        'provider' => 'users',
    ],

    'partners' => [
        'driver' => 'sanctum',
        'provider' => 'partners',
    ],

    'admins' => [
        'driver' => 'sanctum',
        'provider' => 'admins',
    ],

        ],
Run Code Online (Sandbox Code Playgroud)

提供者:

providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    'partners' => [
        'driver' => 'eloquent',
        'model' => App\Models\Partner::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ],
],
Run Code Online (Sandbox Code Playgroud)

模型:

必须添加可验证

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticatable
{
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
Run Code Online (Sandbox Code Playgroud)

中间件:

Route::middleware(['auth:admin'])->get('/user', function(){
   
}
Run Code Online (Sandbox Code Playgroud)

警卫:

auth()->guard('admin')->user();
Run Code Online (Sandbox Code Playgroud)

未经验证的用户消息:

在应用程序/异常/Handler.php

use Illuminate\Auth\AuthenticationException;
Run Code Online (Sandbox Code Playgroud)

功能:

protected function unauthenticated($request, AuthenticationException $exception)
    {
       return response()->json(['message' => 'Unauthenticated.'], 401);

}
Run Code Online (Sandbox Code Playgroud)

或者

自定义防护和自定义重定向

public function render($request, Exception $exception)
{
    $class = get_class($exception);

    switch($class) {
        case 'Illuminate\Auth\AuthenticationException':
            $guard = array_get($exception->guards(), 0);
            switch ($guard) {
                case 'admin':
                    $login = 'admin.login';
                    break;
                default:
                    $login = 'login';
                    break;
            }

            return redirect()->route($login);
    }

    return parent::render($request, $exception);
}
Run Code Online (Sandbox Code Playgroud)


小智 -1

我认为默认的守卫应该是这样的:

'defaults'{
    'guard' : "sanctum_admin",
    'passwords': 'admins',
}
Run Code Online (Sandbox Code Playgroud)

或者

'defaults'{
    'guard' : 'web',
    'passwords' : 'users',
}
Run Code Online (Sandbox Code Playgroud)