$request->user (‘admin’) 获取用户信息时 返回 NULL

我在config/Auth.php guards内定义如下:

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

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

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

其中admin是我定义的

providers内定义如下:


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

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

$request->user('admin') 为什么返回NULL,我不知道错在了哪里

保持好奇,求知若饥,终身编程
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 8

请求头加上token了吗

4年前 评论

这个是必须请求头有token才能获取到吗

4年前 评论
normaluser 4年前
Dennis_Ritchie

App\Models\Admin::class,我看一下

4年前 评论
Liuzhipeng_laravel (楼主) 4年前
<?php

namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;

class Admin extends Authenticatable
{
    use Notifiable, HasApiTokens, HasRoles;

    /**
     * 平台管理员数据表
     */
    protected $table = 'admins';

    /**
     * 守卫
     */
    protected $guard_name = 'admin';
}
4年前 评论

贴一下登录代码,登录的时候要用adminguard才行,目测是因为你没用,所以用了默认的default guard web

4年前 评论

@FMW

    public function login(LoginRequest $request)
    {
    try {
        $credentials = $request->validated();

        if(!Auth::guard('admin')->attempt($credentials))
        return $this->failed('用户名或密码错误!');

        $user = $request->user();

        $tokenResult = $user->createToken($user->name . ' Personal Access Token');

        return $this->success([
        'access_token' => $tokenResult->accessToken,
        'token_type' => 'Bearer',
        ]);
    } catch (\Exception $e) {
        report($e);
        return $this->failed('错误代码:40002');
    }
    }
4年前 评论

你用的passport啊,那必须要带有Authorization的头才行,还有你这里登录怎么就直接从$request获取用户了,你这是要获取web guard的登录用户?那你还判断密码干什么?

4年前 评论
Liuzhipeng_laravel (楼主) 4年前

@Liuzhipeng_laravel 你这么一说还真是,guardpassport是无效的,源码里面是直接写死了获取apiguard

// /vendor/laravel/passport/src/Bridge/UserRepository.php
public function getUserEntityByUserCredentials($username, $password, $grantType, ClientEntityInterface $clientEntity)
{
    // 这里写死了获取api这个guard,所以你写的admin是没有用的
    $provider = config('auth.guards.api.provider');

    if (is_null($model = config('auth.providers.'.$provider.'.model'))) {
        throw new RuntimeException('Unable to determine authentication model from configuration.');
    }

    if (method_exists($model, 'findForPassport')) {
        $user = (new $model)->findForPassport($username);
    } else {
        $user = (new $model)->where('email', $username)->first();
    }

    if (! $user) {
        return;
    } elseif (method_exists($user, 'validateForPassportPasswordGrant')) {
        if (! $user->validateForPassportPasswordGrant($password)) {
            return;
        }
    } elseif (! $this->hasher->check($password, $user->getAuthPassword())) {
        return;
    }

    return new User($user->getAuthIdentifier());
}
4年前 评论
Liuzhipeng_laravel (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!