当前位置: 首页 > 知识库问答 >
问题:

如何更改/自定义密码字段名称为Laravel 4和Laravel 5用户身份验证[重复]

李弘光
2023-03-14

我想在使用Laravel身份验证时更改数据库中的密码字段。我希望我的列在用户表中有名称Passwd而不是密码。我试着运行这样的东西:

Auth::attempt(array(
    'user_name' => 'admin',
    'passwd' => 'hardpass',
));

但它不起作用。

我还尝试在User模型中添加以下函数:

public function getAuthPassword() {
    return $this->passwd;
}

但它也不会改变什么。用户仍未通过身份验证。在Laravel中是否可以更改数据库中的密码字段名?

共有1个答案

勾学博
2023-03-14

您可以轻松更改数据库中的所有其他字段,并使用它们进行身份验证。唯一的问题是密码字段。

事实上,password字段在某种程度上是用Laravel硬编码的(但不是许多人认为的方式),所以您不能像在问题中传递一样传递数组。

默认情况下,如果您将数组传递给尝试(可能还有其他身份验证函数,如验证一次),如果您这样做:

Auth::attempt(array(
    'user_name' => 'admin',
    'password' => 'hardpass',
));

默认的Eloquent驱动程序将运行以下查询:

select * from `users` where `user_name` = 'admin' limit 1;

从数据库获取此数据后,它会将您提供的密码与创建的用户对象的password属性进行比较。

但是如果你简单地使用:

Auth::attempt(array(
    'user_name' => 'admin',
    'passwd' => 'hardpass',
));

将运行以下查询:

select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1;

并且在数据库中找不到用户(在Passwd中存储哈希密码)。这是因为Eloquent从查询密码中删除,但使用任何其他数据来运行查询。此外,如果您尝试在这里使用'Passwd'=

解决这个问题很容易。您需要像这样运行Auth::trunt

Auth::attempt(array(
    'user_name' => 'admin',
    'password' => 'hardpass',
));

正如您看到的,您仍然将密码作为密钥传递(尽管用户表中不存在此列),因为只有这样,雄辩的驱动程序才不会将其用于生成查询。

现在在UserModel(app/Model/User.php)文件中需要添加以下函数:

public function getAuthPassword() {
    return $this->passwd;
}

正如您在这里看到的,您使用的是数据库中真正存在的列:passwd

通过这种方式,您可以将带有密码的列命名为您想要的任何内容,并且您仍然可以为其使用默认的雄辩驱动程序。

我已经为它创建了非常简单的测试。

您只需将app/routes.php文件替换为以下文件:

Route::get('/', function () {

    if (Auth::check()) {
        echo "I'm logged in as " . Auth::user()->user_name . "<br />";
        echo "<a href='/logout'>Log out</a>";
    } else {
        echo "I'm NOT logged in<br />";


        Auth::attempt(array(
            'user_name' => 'admin',
            'password'  => 'hardpass',
        ));


        if (Auth::check()) {
            echo "Now I'm logged in as " . Auth::user()->user_name . "<br />";
            echo "<a href='/logout'>Log out</a>";
        } else {
            echo "I'm still NOT logged in<br />";
        }
    }


});

Route::get('/logout', function () {
    Auth::logout();
    return "You have been logged out";
});


Route::get('/db', function () {

    if (!Schema::hasTable('users')) {


        Schema::create('users', function ($table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('user_name', 60)->unique();
            $table->string('passwd', 256);
            $table->rememberToken();
            $table->timestamps();
        });

        DB::table('users')->insert(
            [
                [
                    'user_name' => 'admin',
                    'passwd'    => Hash::make('hardpass'),
                ]
            ]
        );
    }

    echo "Table users has been created";
});
  1. app/config/database.php中创建空数据库并设置连接数据

该溶液在Larave 4.2.9(如上所述)和Laravel 5中进行了测试。在Laravel5中,所有操作都是一样的,但您当然需要编辑不同路径中的文件:

  1. 用户模型在app/User.phpfile
  2. 路由在app/Http/routes.php文件
  3. 数据库配置文件在config/database.phpfile

 类似资料:
  • 问题内容: 我想在使用Laravel身份验证时更改数据库中的密码字段。我希望表中的列具有名称而不是。我试图运行这样的事情: 但这不起作用。 我还尝试在模型中添加以下功能: 但它也没有改变。用户仍未通过身份验证。Laravel中可以更改数据库中的密码字段名称吗? 问题答案: 您可以轻松更改数据库中的所有其他字段并将其用于身份验证。唯一的问题是领域。 实际上,字段在Laravel中以某种方式进行了硬编

  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • 我正在使用fire base制作一个反应原生应用程序,用于使用电子邮件登录im并通过身份验证。但是,有没有办法使用用户名和密码登录?

  • 客户已创建密钥存储库并存储凭据。为了验证密钥存储库,我已经在节点中创建了应用程序,并使用客户端id和客户端机密,我能够读取机密。但是现在客户不想使用客户id和客户机密,而是使用AZURE的用户名和密码来访问程序中的keyvault。它是一个没有MFA的keyvault访问的专用用户。 我不确定我们是否可以从节点JS使用用户名和密码访问keyvault。敬请建议。 谢谢

  • 我们正在研究在我们的应用程序中实施基于SAML的SSO身份验证,我想知道是否可以通过SAML指定自定义重定向URL。换句话说,我们可以在身份提供者中配置一个服务提供者,并让服务提供者通过SAML请求指定身份提供者在登录后应将用户重定向到哪里? 我们之所以要寻找这样的东西,是因为我们的应用程序运行在不同的服务器上,这取决于它们所处的开发阶段(开发、测试、暂存、生产)。如果我们不必为要迁移到SAML

  • 我正在创建一个laravel应用程序与自定义多重身份验证。我正在跟随这篇文章进行多重身份验证。https://pusher.com/tutorials/multiple-authentication-guards-laravel 我已经创建了登录和注册控制器定义的警卫和提供者,一切正常,我能够注册用户并登录他们。我写了一页(http://127.0.0.1:8000/admin)只有当管理员登录时