繁体   English   中英

Laravel:如何更改默认的身份验证密码字段名称?

[英]Laravel: How can I change the default Auth Password field name?

我目前正在开展我的第一个 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

对于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 中定义一个访问器

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

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

用这个。 这对我有用。

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

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

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

也在 LoginController.php 上

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

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

那应该这样做。

在上述答案旁边的 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功能自定义提供商。

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

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

IN 自定义控制器

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

在您的 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";

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM