php - Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作

标签 php laravel authentication jwt lumen

我花了一天时间试图了解如何在我的 API 中注入(inject) JWT 身份验证,但不幸的是我没有取得任何成功。

我正在使用Lumen框架。我认为 JWT Auth 库很棒 JWT For Lumen And Laravel 。我已经通过 Composer 成功安装了它,看起来它工作正常,但是我的项目中没有默认的用户模型,我可以轻松迁移到默认的,但我想了解所有这些东西是如何工作的。

我不会在这里发布示例代码,为了使问题更短,这里是 JWT Example

我对 LaravelLumen 比较陌生,所以也许我的问题已经得到解答,但我花了几个小时试图查找文档并理解 Auth 框架中的核心。

我有自定义用户模型

<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
    const CREATED_AT = 'createTime';
    const UPDATED_AT = 'updateTime';
    public $timestamps = true;
    protected $table = 'user';
    protected $guarded = ['password','login','id','activationEmail'];
    protected $hidden = [ 'password' ];
    protected function getDateFormat()
    {
        return 'U';
    }
}

当然还有自定义 Controller 来将请求路由到它。

但问题是,我最近发现JWT库使用Auth来实现jwt身份验证。

并且Auth使用默认用户模型做了一些神奇的事情,这反过来又实现了UserInterface ,我的模型也应该实现这个接口(interface)吗?

我尝试在配置中显式指定我的模型,但它仍然尝试使用旧模型并抛出 App\User 未找到的异常。

请帮助找到这些问题的答案:

  1. 默认情况下框架如何知道我的用户表的名称是什么以及它有哪些字段?或者它假设它有用户名称,并且表中的列很常见,例如电子邮件、登录名、密码等。

  2. 调用尝试方法时会发生什么?框架尝试通过电子邮件查找用户,例如,如果找到,则检查密码?

  3. 如何指定我的自定义模型,我尝试更改配置并得到此问题 Missing argument 1 for Illuminate\Auth\AuthManager::createDriver() lumen and JWT 中描述的异常

如果有人帮助解决和理解这个问题,我将不胜感激。

感谢大家的帮助。

最佳答案

好问题,默认情况下 Laravel 中的用户表将是用户。

您可以使用 $table 属性在模型中设置表名称。

  1. 将模型视为数据库的表示。如果您有一个名为 books 的表,则通常会有一个名为 Books 的模型。同样在 Laravel 中,要生成模型,请从命令行运行 php artisan make:model ModelName。这将为您完成大部分工作。

  2. 当调用 Auth::attempt() 时,您会传递一组凭据,它将与您的数据库进行匹配。所以你可以做 Auth::attempt(['email' => $email, 'password' => $password])Auth::attempt(['username' => $username, 'password) ' => $password, 'active' => 1], $remember)。是的,密码已检查,您也可以使用 Hash::check() 手动检查密码。

  3. 创建自定义模型时,请使用 php artisangenerate 命令来为您制作模型。然后将命名空间更改为您的目录结构,以便 Composer 可以为您自动加载该类(仅当您将模型移动到模型目录时)。从那里,您无需执行任何操作即可与数据库进行交互,同样,模型仅代表一个表。除非您创建一个名为 AllBooks 的模型来表示 Books 表,否则您需要将 $table 属性定义为 $table = 'Books';

我真的建议您在进入像 Laravel 这样的框架之前深入学习面向对象。虽然您想这样做很好,但它可能会误导您。

如果您打算继续使用 laravel/lumen,还有一个快速提示。创建表时,请记住添加updated_at和created_at日期时间字段,如果不这样做,则在模型中将时间戳属性设置为false,如下所示:public $timestamps = false;

祝你好运!

关于php - Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935035/

相关文章:

php - 如何同时运行这两个查询?

php - 移动 WordPress 后,可以登录,但不再有管理员访问权限

PHP 更新 MySQL,表单输入作为列名

php - Laravel - 验证 - 如果字段为空则需要

security - 如果 SSH key 是自动创建的,为什么还要重新创建它们?

rest - 使用REST api的Guid token 而不是用户名/密码进行基本身份验证

PHP/MySQL 检索图像路径

laravel - google-api 如何在带有 token 的离线请求中工作

mysql - 如何通过 Laravel 迁移触发每一行的 MySQL 过程

security - 如何使用PowerShell获取进程的启动帐户?