【问题标题】:Laravel: How can I change the default Auth Password field name?Laravel:如何更改默认的 Auth Password 字段名称?
【发布时间】:2017-01-15 09:56:55
【问题描述】:

我目前正在处理我的第一个 laravel 项目,但遇到了一个问题。

如果你有使用 laravel 的经验,你可能知道通过调用 php artisan make:auth 你会得到一个预定义的机制来处理登录和注册。

此机制旨在理解几个常用词,以使整个过程自动化。

在我的情况下发生的问题是我使用的是 oracle db,它不会让我有一个名为 password 的表列,因为它是一个系统关键字,并且在尝试插入用户时会引发错误.

到目前为止,我已尝试将我的 password 列更改为 passwd,并且它在我的注册表中按预期工作。用户行已成功插入,我的页面被重定向到 /home。

但是当我尝试注销然后重新登录时,我收到此错误消息,告诉我我的凭据不正确:

至于我的代码,我已经更改了我的RegisterController.php,以便它使用用户名而不是电子邮件

protected function validator(array $data)
{
    return Validator::make($data, [
        'username' => 'required|max:50|unique:ECON_USERS',
        'passwd' => 'required|min:6|confirmed',
    ]);
}

protected function create(array $data)
{
    return User::create([
        'username'   => $data['username'],
        'passwd'     => bcrypt($data['passwd'])
    ]);
}

用户 $fillable

protected $fillable = [
    'username', 'passwd'
];

我猜 Auth 正在尝试使用 email 而不是 username 进行身份验证,或者 Auth 正在搜索 password 而不是 passwd

【问题讨论】:

  • 诸如此类的问题让我无法为新项目推荐 Laravel 5.4。我正在努力解决同样的问题。尽管在我的情况下,我更改了表名和密码字段名,并且必须在自定义用户表中添加一堆其他字段。不知道如何使用用户和驱动程序的 eloquant 模型让登录控制器再次工作。
  • 我也有同样的问题,请问如何解决?

标签: php laravel laravel-5


【解决方案1】:

如果使用 username 而不是 email,您可以在 LoginController.php

中覆盖 username()
/**
 * Get the login username to be used by the controller.
 *
 * @return string
 */
public function username()
{
    return 'username';
}

对于passwd 而不是password,您可以在App\User.php

中定义accessor
/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->passwd;
}

login.blade.php :将email 输入替换为username,但不要更改password 的输入名称。

【讨论】:

  • @D.Intziadis 我希望用户名也能正常工作。我自己没有测试过那部分。
  • 根据以下答案更改用户模型后,LoginController 在 Laravel5.4 中仍然无法工作。按照上述方式登录时,我看到相同的错误消息。注册用户虽然有效。
  • @Andy 你也改密码栏了吗?
  • @Gaurav 是的。我还更改了表名、主键列和密码列名,实际上我的用户表中的列比 Laravel5.4 中使用的默认用户基表多。
  • 对于 5.4,您可以添加密码访问器并返回您的自定义字段名称。 public function getPasswordAttributereturn $this->myCustomPasswordName.
【解决方案2】:

使用这个。这对我有用。

到目前为止,我已经更改了 User.php

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

public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = bcrypt($value);
    }

同样在 LoginController.php 上

public function username()
{
    return 'usuario';
}

【讨论】:

  • 为什么叫bcrypt?该值应该已经加密
【解决方案3】:

app/Http/Controllers/Auth/LoginController覆盖默认类中添加:

/**
 * Validate the user login request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 */
protected function validateLogin(Request $request)
{
    $this->validate($request, [
        $this->username() => 'required', 'passwd' => 'required',
    ]);
}

别忘了加use Illuminate\Http\Request;

您可能也必须将此添加到您的LoginController

/**
     * Get the needed authorization credentials from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'passwd');
    }

应该可以的。

【讨论】:

  • 我对此有很好的感觉,但我仍然得到错误的凭据:/ 有什么办法可以记录这个吗?进一步寻找问题?
  • 对不起,我刚刚测试过,这些更改在 Laravel5.4 中不起作用。
【解决方案4】:

在 Laravel 5.7 中,除了上述答案之外,您还必须更改 EloquentUserProvider 类。在文件中的第 107,117 和 140 行中搜索“密码”字,找到“密码”字并将其更改为新名称,这就是解决方案。

  • 在用户模型中添加此方法:
public function getAuthPassword(){
    return $this->new_password_name;
}
  • 在 LoginController 中添加:
protected function validateLogin(Request $request){
    $this->validate($request, [
        $this->username() => 'required',
        'new_password_name' => 'required',
    ]);
}
protected function credentials(Request $request)
{
    return $request->only($this->username(), 'new_password_name');
}
public function username()
{
    return 'new_username';//or new email name if you changed
}
  • 在 login.blade.php 中更改 html 元素的 ID 和名称。
  • validateCredentialsretrieveByCredentials 函数内的 EloquentUserProvider 类中,使用新名称更改“密码”字词。

编辑 :我更改了 EloquentUserProvider 类,但如果您认为更改 laravel 类是一种不好的做法,您可以创建自定义提供程序并覆盖自定义提供程序中的 retrieveByCredentialsvalidateCredentials 函数。

【讨论】:

  • 您不应该更新供应商目录中的任何文件。所以直接更新EloquentUserProvider 是非常糟糕的做法。不要这样做。而是创建一个扩展用户提供程序的新类,覆盖您需要的方法,然后注册新类以替换 EloquentUserProvider
  • 99% 的情况下您不应更改供应商代码。但在极少数情况下,您可以。您只需要设置一种自动方式来在部署时更改它。我记得 Laravel 5.0 代码和一个 DB Backup 包有 2 个问题,该包仅在 Laravel 5.1+ 中修复了错误。因此,我没有浪费所有时间升级到 5.1 和 5.7 之后,而是破解了它。后来我升级到 5.7 是 bug 不存在了。因此,感谢你们两位指出负责的方法并改为扩展和覆盖。并且一些有限的服务器访问与 ftp 不与供应商黑客冲突
【解决方案5】:

如果您使用的是最新版本。我像下面的代码一样返回它,用于自定义密码字段。最后,我使用的是 Lumen 6.x,尽管它也适用于当前版本的 Laravel。

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

【讨论】:

    【解决方案6】:

    在自定义控制器中

    public function login(Request $request){
    
        if (Auth::attempt(['email' => $request->email,'password' => $request->password], false)){
    
             return redirect()->intended(route('subportal.dashboard'));
        }
    
        return $this->sendFailedLoginResponse($request);
    }
    
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required', 'password' => 'required',
        ]);
    }
    
    /**
     * Get the login username to be used by the controller.
     *
     * @return string
     */
    public function username()
    {
        return 'email';
    }
    

    在 App/Users.php 中

    public $table = "customer";
    protected $primaryKey = 'cust_id';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'pass', 'email','record_date',
    ];
    
    public function getAuthPassword() {
        return $this->pass;
    }
    

    【讨论】:

      【解决方案7】:

      在您的 AuthController.php 中(位于 app/http/Controllers/Auth 中)

      public function postLogin(Request $request)
      {
          $this->validate($request, [
                      'username' => 'required',
                      'password' => 'required',
          ]);
      
          $credentials = ($request->only('username', 'password'));
          if ($this->auth->attempt($credentials)) {
             //do something, credentials is correct!   
          }
          return "Ops! snap! seems like you provide an invalid login credentials";
      
      }
      

      【讨论】:

      • 不工作,亲爱的,谢谢。
      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2017-04-13
      • 2018-02-02
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多