Laravel Sanctum 自定义守卫

2024-04-03

我的 laravel 应用程序中有多个守卫:

Code config/auth.php:

'defaults' => [
    'guard' => 'user',
    'passwords' => 'users',
],

'guards' => [
    'user' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => true,
    ],
    'admin' => [
        'driver' => 'token',
        'provider' => 'admins',
        'hash' => true,
    ]
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => Admin::class,
    ],
],

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'users_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
    'admins' => [
        'provider' => 'admins',
        'table' => 'admins_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
],

'password_timeout' => 10800,

并有获取经过身份验证的用户的路线api.php:

Route::get('admins/auth/user', 'AuthController@user')->middleware('auth:sanctum');

另外在我的模型(管理员,用户)中使用了特征:

Laravel\Sanctum\HasApiTokens

当我尝试通过令牌获取身份验证用户时,出现错误消息:

InvalidArgumentException: Auth guard [web] is not defined. in file appname\vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php on line 84

#0 appname\vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php(68): Illuminate\Auth\AuthManager->resolve()
#1 appname\vendor\laravel\sanctum\src\Guard.php(45): Illuminate\Auth\AuthManager->guard()
#2 [internal function]: Laravel\Sanctum\Guard->__invoke()
#3 appname\vendor\laravel\framework\src\Illuminate\Auth\RequestGuard.php(58): call_user_func()
#4 appname\vendor\laravel\framework\src\Illuminate\Auth\GuardHelpers.php(60): Illuminate\Auth\RequestGuard->user()
#5 appname\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(63): Illuminate\Auth\RequestGuard->check()
#6 appname\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(42): Illuminate\Auth\Middleware\Authenticate->authenticate()

我已经运行过命令:

php artisan cache:clear
php artisan config:cache

还尝试添加警卫名称config/sanctum.php:

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1')),

'expiration' => null,

'middleware' => [
    'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
    'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],

// This line added
'guard' => 'admin'

我解决了类似的问题,因为我对 USERS 和 ADMINS 用户使用身份验证。 您可以使用 sainttum 通过使用中间件('auth: sainttum')的 laravel / ui 包来验证自己的身份,但要使其使用 ADMIN 模型而不是 USER,您必须更改守卫。 让我解释一下: sainttum 通常是 auth 中定义的一个守卫,“web”和“api”也是如此,默认情况下 auth.guards.sanctum 的provider = null。所以我所做的就是定义我自己的守卫:

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

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

您可以使用中间件('auth: sainttum')保护您的路由 通过这种方式,您使用的是管理模型而不是用户模型。 每次调用您使用 auth: sainttum 保护的组内的路由时,此 auth.guard 都会将其绑定到providers.admins,这将始终验证管理模型。

你将遇到的问题是,当你登录时,你必须定义登录时要使用哪个守卫,因为如果你使用 laravel / ui 包,它默认使用守卫。 web,这将关联 User 模型,尽管 User 模型中存在具有相同凭据的用户,但当他访问受 sainttum 保护的路径时,他会与 Admin 模型验证凭据。 因此,诀窍是,在登录时,强制将守卫更改为具有提供者管理员的守卫。 就我而言,我所做的是创建一个中间件,它的作用是更改 Guards.web 的提供者 创建中间件,我将其注册到routeMiddleware中的kernel.php文件中,并如下所示:

'auth.admin' => \ App \ Http \ Middleware \ AuthenticateGuardAdmin :: class,

中间件包含这行代码: config::set('auth.guards.web.provider', 'admins');

我把它放在这里的中间件:

Route :: middleware ('auth.admin') -> group (function () {
    Auth :: routes (['register' => false]);
    Route :: middleware ('auth: sanctum') -> group (function () {
        Route :: get ('/ home', 'HomeController @ index') -> name ('home');
    });
});

在使用 laravel / ui 包的标准控制器登录时,我已经告诉配置变量,将使用的提供程序将是我定义的使用 Admin 模型的提供程序。 这样,登录、身份验证和授权始终通过管理模型完成。

之后,您甚至可以使用其他身份验证定义和其他模型或相同的默认用户模型来创建其他路由组,甚至可以使用 API 路由或 Web 路由中的密室。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel Sanctum 自定义守卫 的相关文章

随机推荐

  • 如何使用java仅获取mongodb中文档的objectId

    我只想从 mongodb 中获取具有匹配条件的 objectId 我可以使用 db 对象和游标方法获取它 但我在这里使用 mongo 客户端 不知道该怎么做 感谢您 MongoClient client new MongoClient lo
  • 返回 JSON 和文件

    如何返回 JSON 响应和文件响应 现在我这样做 runNumber A0001 response None try response make response Line One r nLine Two r n response head
  • 按相等性对对象进行分组

    我有一个对象集合 我想使用如下所示的方法来比较它们的相等性 bool AreEqual MyObject O1 MyObject O2 将所有相同对象分组的最性能友好的方式是什么 显而易见的答案是将每个对象与集合中的所有其他对象进行比较 但
  • 减去数据框中的两列

    我的 df 看起来如下 Index Country Val1 Val2 Val10 1 Australia 1 3 5 2 Bambua 12 33 56 3 Tambua 14 34 58 我想从每个国家 地区的 Val1 中减去 Val
  • SQL Server 中 IsInteger 的最佳等效项

    在 SQL Server 2000 2005 2008 中确定字段值是否为整数的最佳方法是什么 IsNumeric 对于多种不太可能转换为整数的格式返回 true 示例包括 15 000 和 15 1 您可以使用类似的语句 但这似乎只适用于
  • Docker 检查格式检索端口映射[重复]

    这个问题在这里已经有答案了 我想使用 docker Inspection 检索映射到容器的端口 我发现了类似的内容 docker inspect format NetworkSettings Ports containerid Output
  • 如何进行空合并提交(忽略更改)?

    自动化 CI 工具合并了来自release to master 但是来自发布分支的一些提交应该被忽略 让我们考虑以下示例 发布分支包含两个修复 fix 1应该被忽略并且fix 2应该合并到master base merge fix 2 ma
  • jboss 7 oracle数据源配置

    我目前正在从 jboss 4 3 迁移到 jboss 7 1 1 Final 我正在尝试配置 Oracle 数据源 但它不起作用 以下是我为设置 Oracle 数据源所做的操作 1 下载ojdbc6 11 jar并将其放在文件夹 JBOSS
  • 使用 bootstrap 4 对 3 列进行排序和堆叠

    I have this structure in bootstrap columns And I want you to change to a lower resolution be ordered as follows 我在这里找到了如
  • PHP 致命错误:未找到“COM”类

    将 PHP 升级到 v 5 5 1 后 我收到此错误 Fatal error Class COM not found in C inetpub wwwroot ndsystems database engine mssql engine p
  • 如何使用 nth-child 为具有行跨度的表格设置样式?

    我有一张表 其中一行使用行跨度 所以 table tr td td td td td td tr tr td td td td td td tr tr td td td td tr tr td td td td td td tr table
  • 如何在 Java 中将日期从 MM/YYYY 转换为 MM/DD/YYYY

    我想将日期从 MM YYYY 转换为 MM DD YYYY 我如何使用 Java 中的 SimpleDateFormat 来做到这一点 注 DD可以是该月的开始日期 请浏览http download oracle com javase 1
  • ggplot 中的概率热图

    I asked this question https stackoverflow com questions 7305803 plot probability heatmap hexbin with different sized bin
  • 如何获取 Linux/UNIX 上当前网络接口吞吐量统计信息? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 MRTG 等工具提供特定接口 例如 eth0 上当前网络利用率的网络吞吐量 带宽图表 如何在 Linux UNIX 上的命令行返回该信息
  • 禁用一个函数的返回值优化

    struct X void a void b X foo void u void v foo 在汇编器中实现 i386 X 类型的返回值的地址作为隐藏参数传递给 foo 如果使用 O0 编译测试代码 则代码将按预期工作 如果使用 O3 编译
  • AH01626:要求全部授权授权结果:已授权

    我在我的网站上运行 apache 2 4 6 我不断在我的 apache 错误日志中看到这条消息一遍又一遍地重复 Tue Nov 10 01 42 40 659710 2015 authz core debug pid 10727 mod
  • 开源 BPM 工具(如 Activiti、bonita)和 Windows Workflow Foundation 之间有什么区别

    我试图找到一个基于asp net的免费开源BPM工具 但不幸的是我没有找到这样的工具 但最近我读到一篇关于Windows Workflow Foundation的文章 那么它是否提供了类似于开源BPM工具如Activiti bonita J
  • 为什么在 WPF 中将 INotifyPropertyChanged 与绑定一起使用?

    我注意到 几乎我在互联网上找到的有关绑定的每个示例都有一个类 绑定到另一个属性 该类继承 INotifyPropertyChanged 接口并在该类属性的 set 部分中使用一个方法 我尝试从绑定示例中删除该部分 其工作原理与该方法相同 这
  • 正则表达式:以不同顺序匹配组而不重复组

    假设我有两个这样的字符串 XABY XBAY 匹配两者的简单正则表达式如下所示 X AB BA Y 但是 我遇到的情况是 A 和 B 是复杂的字符串 我正在寻找一种方法来避免必须将它们分别指定两次 在 的每一侧 有没有办法做到这一点 这可能
  • Laravel Sanctum 自定义守卫

    我的 laravel 应用程序中有多个守卫 Code config auth php defaults gt guard gt user passwords gt users guards gt user gt driver gt toke