好的,为了简单起见,我有一个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处理这个问题,但肯定这可能是“正常”的方式。
答案 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的哈希密码 - 假设为DatabaseUserProvider
和EloquentUserProvider
,这样你就可以安全地实现该方法,但不做任何事情如果您使用自己的提供商,则非常有用。
但是,如果您无法真正看到创建自己的提供程序只是为了撤消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
字段。