Laravel Sanctum可以使用多重验证守卫

rggaifut  于 2023-01-06  发布在  其他
关注(0)|答案(8)|浏览(163)

我正在测试拉拉威尔圣所,但这里有些问题..我正在创建管理员警卫。

当我将中间件更改为auth:sanctum_admin..它应该只能由管理员访问,但在这里我可以使用普通用户帐户与网络警卫访问。我不知道为什么?...我使用passport与multiauth package.it的罚款。但在这里sanctum不能分开的用户表和管理员。

chhqkbe1

chhqkbe11#

你也可以在密室中使用多个守卫。要做到这一点,请遵循以下步骤-
1.根据需要创建您自己的防护。(在config/auth.php中)

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

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

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ]
    ],

1.设置提供程序。(在config/auth.php中)

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

       'admins' => [
           'driver' => 'eloquent',
           'model' => App\Admin::class,
       ],
   ],

1.验证用户身份时使用此保护。(在路由文件中)

if(auth()->guard('admin')->attempt($request->only('email','password')))
{
    return auth()->guard('admin')->user();
}
ee7vknir

ee7vknir2#

@阿布舍克·米特拉
对于Multiple Auth Guard情况下使用Laravel Sanctum的授权,我们可以使用中间件

Route::middleware(['auth:guard_name'])->get('/user', function(){
    return auth()->guard('guard_name')->user();
}
nhaq1z21

nhaq1z213#

    • 配置/身份验证php**

司机是"圣地"

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

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

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

        ],

提供者:

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,
    ],
],

型号:
必须添加可验证

<?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',
    ];
}

中间件:

Route::middleware(['auth:admin'])->get('/user', function(){
   
}

警卫:

auth()->guard('admin')->user();
    • 未经身份验证的用户消息:**

在应用程序/异常处理程序/Handler.php中

use Illuminate\Auth\AuthenticationException;

功能:

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

}


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

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);
}
wh6knrhe

wh6knrhe4#

1.你必须在config/auth.php中添加你的自定义保护.
'警卫' =〉[

'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'custom-guard' => [
        'driver' => 'session',
        'provider' => 'custom-provider',
    ]
],

小心,这driver在custom guard必须是session.并且设置提供者为:

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

   'custom-provider' => [
       'driver' => 'eloquent',
       'model' => App\CustomProvider::class,
   ],

],App\CustomProvider::类必须是模型。之后可以轻松地在auth中使用guard。

auth('custom-guard')->user()
zte4gxcn

zte4gxcn5#

我也面临着同样的问题,并通过以下方式解决了它-
1.在auth.php中添加额外的防护装置-front

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'front' => [
            'driver' => 'session',
            'provider' => 'members',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => Vanguard\User::class,
        ],

        'members' => [
             'driver' => 'eloquent',
             'model' => Vanguard\Member::class,
        ],
    ],

1.以默认用户或成员身份登录

/** Default Guard**/
if (Auth::attempt(['username' => $credentials['username'], 'password' => $credentials['password']], $request->get('remember'))) {
}
/** Front Guard **/
if (Auth::guard('front')->attempt(['username' => $credentials['username'], 'password' => $credentials['password']], $request->get('remember'))) {
}

1.最后在sanctum.php中添加防护装置

'guard' => ['front','web']
lvmkulzt

lvmkulzt6#

在配置文件/授权文件中:

'guards' => [
    ...

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

(在Laravel 9.x中测试)

pw9qyyiw

pw9qyyiw7#

使用sanctum驱动程序定义API安全区防护

'guards' => [
        // Web Guards
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        //API Sanctum Guards
        'admin-api' => [
            'driver' => 'sanctum',
            'provider' => 'admins',
        ],
        'vendor-api' => [
            'driver' => 'sanctum',
            'provider' => 'vendors',
        ],
    ],

定义提供程序

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

正在生成令牌

$user = Admin::where('email', $request->email)->first();
$token = $user->createToken(uniqid());
return ['token' => $token->plainTextToken];

$user = Vendor::where('email', $request->email)->first();
$token = $user->createToken(uniqid());
return ['token' => $token->plainTextToken];

使用sanctum guard保护路由

Route::middleware('auth:admin-api')->get('/admin', function (Request $request) {
    return $request->user();
});

Route::middleware('auth:vendor-api')->get('/vendor', function (Request $request) {
    return $request->user();
});
ru9i0ody

ru9i0ody8#

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

'defaults'{
    'guard' : "sanctum_admin",
    'passwords': 'admins',
}

或者

'defaults'{
    'guard' : 'web',
    'passwords' : 'users',
}

相关问题