所以我已经发现了一些问题,即必须重写getAuthPassword()才能从数据库中为密码列提供自定义名称。尝试将此方法与数据库中的列同名,但没有成功。它仍然会出现以下错误:未定义的索引:密码。
这是身份验证:
if (Auth::attempt(Input::only('user_displayName'), Input::get('user_password')))
尝试将表单和控制器中的user_password更改为password,但无效。
所以问题是,如果我在数据库中有一个名为"user_password"的列,有没有办法让Auth工作?
p.S检查了我发现的每一个旧的解决方案
编辑
用户表结构:
+======================+
| User |
+======================+
| user_id |
+----------------------+
| user_displayName |
+----------------------+
| user_fname |
+----------------------+
| user_lname |
+----------------------+
| user_email |
+----------------------+
| user_password |
+----------------------+
| created_at |
+----------------------+
| updated_at |
+----------------------+
tldr;只要用户模型正确实现了接口,您就可以随心所欲地命名密码字段
但是,不能将不同的数组键传递给Auth::attempt
方法-只能有password
索引
首先,你做错了-你需要传递一系列凭据作为第一个参数:
if (Auth::attempt(Input::only('user_displayName', 'user_password')))
接下来,不幸的是,Eloquent
提供程序在代码中有硬编码的password
数组索引,因此无法将user_password
传递给attempt
方法。
所以这就是你需要的:
$credentials = Input::only('user_displayName');
$credentials['password'] = Input::get('user_password');
if (Auth::attempt($credentials))
// or simply rename the input in your form to password and:
if (Auth::attempt(Input::only('user_displayName', 'password')))
我还没有测试过这个,但我相信你只需要覆盖UserTrait.php中的一个函数,尽管不要破解源代码。在models/User.php文件中添加以下函数。
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->user_password;
}
对于实现给定接口不够的情况(例如,您有两个密码列,一个用户密码和一个支持密码),有一个静态解决方案。
$qry = DB::table('users')
->where('email', $email)
->whereNotNull('support_password')
->first();
if(!empty($qry))
{
$check = Hash::check($password, $qry->support_password);
if ($check)
{
Auth::loginUsingId($qry->id, true);
}
}
以下是我在不更改供应商代码的情况下将Laravel登录的默认电子邮件字段更改为"email_address"的方法。
我创建了一个特性类,它扩展了供应商AuthenticatesUsers特性。并且只扩展了username方法。
App''Http''Controllers''Auth''AuthenticatesLogins.php:
namespace App'Http'Controllers'Auth;
use Illuminate'Foundation'Auth'AuthenticatesUsers;
trait AuthenticatesLogins
{
use AuthenticatesUsers {
AuthenticatesUsers::username as parentUsername;
}
/**
* Get the login username to be used by the controller.
*
* @return string
*/
public function username()
{
$this->parentUsername();
return 'email_address';
}
}
现在位于App''Http''Controllers''Controller''LoginController.php:
class LoginController extends Controller
{
use AuthenticatesLogins; // <-- for custom login fields
// etc.
而且。。。完成!希望这能有所帮助。