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

时间:2014-02-12 22:38:06

标签: php laravel eloquent

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

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

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

有了这个,我收到关于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;
    }
}

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

任何帮助都会很好。

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

4 个答案:

答案 0 :(得分:6)

在Laravel 4中登录没有密码的用户。您只需要调用方法login

Auth::login($user);

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

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

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

答案 1 :(得分:5)

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

据我了解,getAuthIdentifier用于在会话中存储用户的ID(并记住我的场景)。所以它几乎必须是用户的任何唯一标识符(听起来像你的com_id字段会在那里做到这一点)。 getAuthPassword确实必须返回一个哈希密码,但这是为了兼容Laravel的哈希密码 - 假设为DatabaseUserProviderEloquentUserProvider,这样你就可以安全地实现该方法,但不做任何事情如果您使用自己的提供商,则非常有用。

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

答案 2 :(得分:3)

这是一个黑客攻击,可能有助于调试。

在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());
    }

答案 3 :(得分:0)

实际上模型中的功能是:

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

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

这些是可变的,默认情况下getAuthIdentifier来自id文件中auth users表设置的app/config/auth.php主键,您可以更改用于用户身份验证的auth驱动程序的表(也是模型)。因此,如果你有users表格和User模型,那么一切正常,请确保用户表格中的主键为id,如果与id不同,那么请点击此处此函数返回该字段,如果它是例如some_id,则返回some_id

getAuthPassword方法默认返回password字段,如果您想更改密码字段,例如some_token,则返回some_token而不是password like {1}}返回$this->passwordField;,此处使用passwordField作为password。这使您可以设置密码字段,您设置的字段将用于验证用户身份。

对于密码提交,请确保在保存时使用mutator方法encript字段。