Laravel:使用Auth驱动程序登录,但没有密码

Ali*_*ias 5 php laravel eloquent

好的,为了保持简单,我有一张users桌子和一个User模型.该表包含一个唯一的标识符com_id(以及其他用户信息),我想登录,但没有密码.

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

if (Auth::attempt(['com_id' => $com_id]))
{
   dd("successful login");
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到一个关于的错误UserInterface,所以在我的模型中我添加:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我该如何处理密码呢?我不能删除该功能,因为它是必需的,我不确定getAuthIdentifier它应该引用什么?

你能帮忙的话,我会很高兴.

我可以通过Sessions处理这个问题,但肯定这可能是"正常"的方式.

小智 6

在Laravel 4中无需密码登录用户login.您只需要调用方法.

Auth::login($user);

此方法将在没有任何凭据检查的情况下登录您的用户.

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

Auth::attempt(array('email' => $email, 'password' => $password), true);


ale*_*ell 5

我想说解决这个问题的正确方法是实现你自己的auth提供程序(扩展UserProviderInterface),它不关心密码.Laravel附带了几个提供程序:DatabaseUserProvider和EloquentUserProvider,但都假设有一个哈希密码.实际上,即使您创建自己的身份验证提供程序,您也必须实现一个验证凭据的方法(但这些凭据不必是基于密码的),但是这种方法可以检查Steam社区ID对API或其他东西.

据我了解,它getAuthIdentifier用于在会话中存储用户的id(并记住我的场景).所以它几乎必须是用户的任何唯一标识符(听起来像你的com_id字段会在那里做到这一点).getAuthPassword确实有返回一个哈希密码,但这是与Laravel的散列密码,假设兼容性DatabaseUserProviderEloquentUserProvider,这样你就可以放心地实施方法,但利用它做些什么有用的,如果你要使用自己的供应商.

但是,如果您无法真正看到创建自己的提供程序只是为了撤消Laravel所做的假设,那么只需在用户模型中实现上述方法(getAuthIdentifier空字符串的唯一标识符或没有返回值getAuthPassword)和使用您自己的方法从数据库中检索用户,然后Auth::login($user)直接使用以绕过传统意义上的任何密码检查.


Kir*_*iva 5

这是一个 hack,可能有助于调试。

在 Laravel 5 中引用该文件/vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php 及其成员函数validateCredentials。他们在这里检查用户的密码(电子邮件、用户名或其他)是否存在。return 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());
    }
Run Code Online (Sandbox Code Playgroud)