Php Laravel:使用身份验证驱动程序登录,但不使用密码

Php Laravel:使用身份验证驱动程序登录,但不使用密码,php,laravel,eloquent,Php,Laravel,Eloquent,好的,为了简单起见,我有一个users表和一个User模型。该表包含一个唯一标识符com\u id(加上其他用户信息),我想用它登录,但没有密码 我想让用户登录,并能够通过身份验证驱动程序访问他们的数据:Auth::user()->email等,但我在登录他们时遇到一些问题 if (Auth::attempt(['com_id' => $com_id])) { dd("successful login"); } 这样,我得到了一个关于用户界面的错误,因此在我的模型中,我添加了: u

好的,为了简单起见,我有一个
users
表和一个
User
模型。该表包含一个唯一标识符
com\u id
(加上其他用户信息),我想用它登录,但没有密码

我想让用户登录,并能够通过身份验证驱动程序访问他们的数据:
Auth::user()->email
等,但我在登录他们时遇到一些问题

if (Auth::attempt(['com_id' => $com_id]))
{
   dd("successful login");
}
这样,我得到了一个关于
用户界面的错误,因此在我的模型中,我添加了:

use Illuminate\Auth\UserInterface;

class User extends Eloquent implements UserInterface {

    protected $table = 'users';

    protected $guarded = array('id');

    public function getAuthIdentifier()
    {
        return $this->steam_community_id;
    }

    public function getAuthPassword()
    {
        return $this->password;
    }
}
但是我该怎么处理密码呢?我无法删除该函数,因为它是必需的,而且我不确定
getAuthIdentifier
应该指什么

任何帮助都很好


我可以通过会话来处理这个问题,但这肯定是“正常”方式。

我认为解决这个问题的正确方法是实现自己的身份验证提供程序(扩展了
UserProviderInterface
),它不关心密码。Laravel附带了两个提供程序:DatabaseUserProvider和EloquentUserProvider,但都采用哈希密码。事实上,即使您创建了自己的身份验证提供程序,您也必须实现一种验证凭据的方法(但这些凭据不必基于密码),但该方法可以用来根据API或其他内容检查steam社区id

据我所知,
getAuthIdentifier
用于在会话中存储用户id(在“记住我”的场景中也是如此)。因此,它几乎必须是用户的任何唯一标识符(听起来您的com_id字段就可以做到这一点)
getAuthPassword
确实必须返回散列密码,但这是为了与Laravel的散列密码兼容,假设
DatabaseUserProvider
EloquentUserProvider
,因此您可以安全地实现该方法,但如果要使用自己的提供程序,则该方法将毫无用处


但是,如果您不能真正理解创建自己的提供者只是为了撤销Laravel所做的假设的意义,那么只需在您的用户模型中实现上述方法(对于
getAuthIdentifier
的唯一标识符和对于
getAuthPassword
的空白字符串或没有返回值)并使用您自己的方法从数据库中检索用户,然后直接使用
Auth::login($user)
绕过传统意义上的密码检查。

实际上,您模型中的功能是:

public function getAuthIdentifier()
{
    return $this->steam_community_id;
}

public function getAuthPassword()
{
    return $this->password;
}
它们是可变的,默认情况下,
getAuthIdentifier
auth
用户的
user
表设置中的
id
主键,您可以更改
auth
驱动程序的表(也是模型)以用于用户身份验证。因此,如果您有
users
表和
User
模型,那么就可以了,确保您的users表中的主键是
id
,如果这与
id
不同,那么在这个函数中返回该字段,如果是
some\u id
则返回
some\u id

默认情况下,
getAuthPassword
方法返回
password
字段,如果您希望使用其他任何内容(例如
some_token
)更改密码字段,则返回
some_token
而不是
password like
返回
$this->passwordField
这里使用
密码字段
作为您的
密码
。这允许您设置密码字段,您设置的字段将用于对用户进行身份验证


对于密码字段,请确保在保存时使用方法来
enccript
该字段。

在Laravel 4中不使用密码登录用户。您只需要调用方法
login

Auth::login($user)

此方法将在不进行任何凭据检查的情况下登录用户

如果您需要检查另一方面的凭据,此方法将检查凭据


Auth::trunt(数组('email'=>$email,'password'=>$password),true)

这是一种黑客行为,可能对调试有所帮助

在Laravel 5中,请参考文件
/vendor\Laravel\framework\src\illumb\Auth\EloquentUserProvider.php
及其成员函数
validateCredentials
。在这里,他们根据用户(电子邮件、用户名等)检查密码是否存在。如果要绕过凭证检查,只需
返回true

    /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        // return true; // this will bypass the password checking.
        $plain = $credentials['password'];

        return $this->hasher->check($plain, $user->getAuthPassword());
    }

看一看。您也可以使用Auth::loginUsingId()。我想我试过了,但似乎没有多大作用,但我会再试一次,但这是唯一的方法吗?感谢您的解释,在更改了一些内容(将标识符恢复正常,并在密码端返回一个空白响应:)后,它就可以工作了)我也在寻找laravel 5.1中的相同概念。如果你知道你可以使用PostThank,但是如果用户从不同的计算机更改密码会发生什么,或者在这种情况下,用户的会话将如何过期。