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,但是如果用户从不同的计算机更改密码会发生什么,或者在这种情况下,用户的会话将如何过期。