laravel 4自定义命名密码列


laravel 4 custom named password column

所以我已经发现了一些问题,即必须重写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.

而且。。。完成!希望这能有所帮助。