使用laravel框架,开发过程中遇到一个坑,使用
$res = Auth::attempt(['user_login' => $userlogin, 'password' => $userpass]);
的时候一直验证不过去,各种方法各种过不去,各种坑,后来吧我的数据库密码字段 user_pass 改成password之后就通过了,我了个大C,原来laravel会限制数据库密码字段的名称。
有些情况下是不能轻易修改数据库字段的,那么该怎么处理这个地方呢。不能修改框架源码吧,改框架源码是一条不归路不可取。所以网上搜索了一些然后放在这里作为记录。就是在User的model里面添加一个方法来重置laravel默认的方法。就是这个
public function getAuthPassword() { //return $this->attributes['user_pass']; return $this->user_pass; //或其它名称,以上两种写法都OK }
还有就是后台使用了laravel默认的用户验证方式,那么前台怎么验证呢?答案是照抄一下写个新的验证。下面是步骤:
第一步:打开 /config/auth.php 配置文件。laravel6.18.* 在第38行 guards 这里添加 一个新的member成员,member照抄web就是了 provider 名字可以自己起,后面用得到。
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], 'member' => [ 'driver' => 'session', 'provider' => 'member', ] ],
第二步:添加完guards之后继续修改后面的配置信息。这个member成员就是前面自己在guards给新成员起的provider里面的名字。model就是复制照抄users。
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'member' => [ 'driver' => 'eloquent', 'model' => App\Member::class, ], ],
第三步:新建Member.php 这个模型文件,位置在 /app/Member.php 内容照抄 /app/User.php
<?php namespace App; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class Member extends Authenticatable { use Notifiable; // protected $table = "users"; protected $fillable = [ 'user_login', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function getAuthPassword() { //return $this->attributes['password2']; return $this->user_pass; //或其它名称,以上两种写法都OK } }
第四部:然后就可以像laravel验证那样优雅的使用啦,接下来就是中间件的一些列操作。
第五步:使用。像这样
$res = Auth::guard('member')->attempt(['user_login' => $user_login, 'password' => $user_pass]);
在Auth后面指定guard就可以了,因为默认(不写)的guard(“web”)已经被前面占用了。
好啦,优雅起来吧。。。。