laravel 4自定义命名密码列

时间:2014-09-23 18:48:30

标签: php database laravel

所以我发现了一些问题,说你必须覆盖getAuthPassword()以从数据库中提供密码列的自定义名称。尝试将此方法与数据库中的列同名,并且无法正常工作。它仍然会发出此错误:未定义的索引:密码。

这是auth:

if (Auth::attempt(Input::only('user_displayName'), Input::get('user_password')))

尝试在表单和控制器中将user_password更改为密码无效。

所以问题是如果我在名为“user_password”的数据库中有一个列,是否有办法让Auth工作?

P.S检查了我发现的每个旧解决方案

修改

用户表的结构:

+======================+
|        User          |
+======================+
|       user_id        |
+----------------------+
|   user_displayName   |
+----------------------+
|     user_fname       |
+----------------------+
|      user_lname      |
+----------------------+
|      user_email      |
+----------------------+
|     user_password    |
+----------------------+
|      created_at      |
+----------------------+
|      updated_at      |
+----------------------+

4 个答案:

答案 0 :(得分:7)

<强> tldr;只要您的用户模型正确实现了界面,您就可以将密码字段命名为您喜欢的任何名称。

但是,您无法将不同的数组键传递给Auth::attempt方法 - 只有password索引可以在那里

首先,你做错了 - 你需要传递一组凭证作为第一个参数:

if (Auth::attempt(Input::only('user_displayName', 'user_password')))

接下来,遗憾的是Eloquent提供商在代码中包含了硬编码的password数组索引,因此您无法将user_password传递给attempt方法。< / p>

所以这就是你所需要的:

$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')))

答案 1 :(得分:1)

我没有对此进行测试,但我相信你只需要覆盖UserTrait.php中的一个函数,尽管不要破解源代码。在您的models / User.php文件中添加以下功能。

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->user_password;
}

答案 2 :(得分:1)

在实现给定接口的情况下,有一个静态解决方案是不够的(例如,您有两个密码列,一个用户密码和一个支持密码)。

$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);
    }
}

答案 3 :(得分:0)

这是我在不更改供应商代码的情况下将Laravel登录的默认电子邮件字段更改为“email_address”的方法。

我创建了一个特性类,扩展了供应商AuthenticatesUsers的特性。并且只扩展了用户名方法。

应用\ HTTP \控制器\验证\ 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.

而且......完成了!希望这会有所帮助。