所以今天我尝试修改laravel项目中的默认身份验证。
首先:Composer(1.4.2)和Laravel(5.4.27)(也意味着所有依赖关系)是最新的。我用以下方法验证了这一点:
composer self-update
composer update
然后我通过迁移改变了用户表:
Schema::table('users', function (Blueprint $users){
$users->string('login', 16)->unique()->after('id');
$users->string('real_name', 32)->after('email');
});
Schema::table('users', function(Blueprint $users){
$users->dropColumn([
'name'
]);
});
其中重要的一点是我想使用'login'而不是'name'。
接下来我做的是修改User类,如下所示:
protected $fillable = [
'login',
'email',
'real_name',
'password'
];
protected $primaryKey = 'login';
public function getAuthIdentifierName()
{
return 'login';
}
还有LoginController:
public function username()
{
return 'login';
}
protected function validateLogin(Request $request)
{
$this->validate($request, [
$this->username() => 'required|string',
'password' => 'required|string',
'g-recaptcha-response' => 'required|captcha'
]);
}
最后我更改了登录视图:
<div class="form-group{{ $errors->has('login') ? ' has-error' : '' }}">
<label for="login" class="col-md-4 control-label">Login</label>
<div class="col-md-6">
<input id="login" type="text" class="form-control" name="login" value="{{ old('login') }}" required autofocus>
@if ($errors->has('login'))
<span class="help-block">
<strong>{{ $errors->first('login') }}</strong>
</span>
@endif
</div>
</div>
现在我应该有一个正常的身份验证,对吗?这就是我的想法。
登录本身是有效的,但是当涉及到读取“登录”字段的值时,它会失败 - 或类似的事情。
debug-bar告诉我以下内容:
将在登录时执行的查询是:
select * from `users` where `login` = 'admin' limit 1
除了“登录”之外,正确加载所有数据。出于某种原因,该字段保持为“0”(在auth web中)
"user" => array:10 [
"id" => 1
"email" => "email@email.com"
"created_at" => "2017-06-16 03:08:43"
"updated_at" => "2017-06-16 03:08:43"
"login" => 0
"real_name" => "PolluX"
当它最终显示默认的主视图时,执行的查询是:
select * from `users` where `login` = '0' limit 1
我正在使用XAMPP v3.2.2,PHP 7.1.1和10.2.6-MariaDB作为我在Windows 10上的本地开发环境。我应该提一下,我更换了这个XAMPP版本的默认发布的MariaDB,并重新下载了最新稳定的MariaDB版本。 (因为迁移事件的错误)
我还检查了StackOverflow,Laracasts等上的auth事件上的多个帖子,但没有找到任何可以帮助我的帖子。
e.g。 https://laracasts.com/discuss/channels/laravel/change-name-column-to-username-in-auth
答案 0 :(得分:1)
回答OP。
删除代码protected $primaryKey = 'login'
和getAuthIdentifierName()
方法。
您所要做的就是在控制器中覆盖(添加)username()
方法。
有关迁移的注意事项以及如何正确执行此操作:
down()
方法创作者和创作者的一些材料。 Laravel的朋友关于迁移的信息可以在这个播客http://www.laravelpodcast.com/episodes/68236-episode-53-bigger-better中听到大约30分钟。