2014-02-12 45 views
4

好吧,为了保持简单,我有一个users表和User模型。该表包含一个唯一标识符com_id(加上其他用户信息),我想用它登录,但没有密码。Laravel:使用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

看看[this](http://laravel.com/docs/security#manually)。你也可以使用Auth :: loginUsingId()。 – Uze

+0

想想我曾尝试过,但它似乎没有太多,但我会再试一次,但这是唯一的方法吗? – Alias

回答

5

我会说解决这个问题的正确方法是实现您自己的身份验证提供程序(延伸UserProviderInterface),不关心密码。 Laravel提供了几个提供程序:DatabaseUserProvider和EloquentUserProvider,但都假设哈希密码。事实上,即使你创建了你自己的认证提供者,你也必须实现一个验证认证的方法(但是这些认证不一定是基于密码的),但是这种方法可能是针对API或其他东西。

据我所知,getAuthIdentifier用于存储会话中的用户ID(并记住我的场景)。所以它几乎必须是用户的任何唯一标识符(听起来就像你的com_id字段会在那里做诡计)。 getAuthPassword确实必须返回哈希密码,但这是为了与Laravel的哈希密码兼容(假设为DatabaseUserProviderEloquentUserProvider),所以您可以安全地实施该方法,但如果要使用自己的提供程序,则该方法无效。但是,如果您无法真正了解创建自己的提供程序的要点,只是为了撤消Laravel所做的假设,那么只需在您的用户模型中实现上述方法(getAuthIdentifier的唯一标识符以及空白字符串或不包含返回值为getAuthPassword),并使用自己的方法从数据库中检索用户,然后直接使用Auth::login($user)来绕过传统意义上的任何密码检查。

+0

感谢您的解释,改变了一些东西之后得到它的工作(把标识符恢复正常,并在密码方面返回一个空白的回应:)) – Alias

+0

我也期待在laravel 5.1。相同的概念。如果你知道你能岗位 – vision

0

其实在你的模型的功能是:

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

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

这些都是可变的,默认情况下,getAuthIdentifierid主键从app/config/auth.php文件您authusers表格设置与您可以更改表(也模型)为auth驱动程序用于用户身份验证。所以,如果你有users表和User模型,然后它的罚款,请确保您的用户表的主键是id,如果这比id不同,那么在这里这个函数返回的那场相反,如果它例如some_id然后返回some_id代替。

getAuthPassword方法默认返回的password字段,如果要更改密码字段与别的例如some_token然后返回的some_token代替password like回报$this->passwordField;这里使用passwordField为您password。这使您可以设置密码,您设置的字段将用于对用户进行身份验证。

如需保存密码,请确保在保存时使用mutator方法至encript该字段。

5

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

Auth::login($user);

这种方法将记录在你的用户没有任何认证检查。

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

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

1

这是一个黑客和调试的情况下可能会有帮助。

在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()); 
    } 
相关问题