【发布时间】:2017-11-19 14:56:00
【问题描述】:
所以今天我尝试在我的 laravel 项目中修改默认的 auth。
首先:Composer (1.4.2) 和 Laravel (5.4.27)(也意味着所有依赖项)都是最新的。我通过以下方式验证了这一点:
composer self-update
composer update
然后我通过迁移更改了 users 表:
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'
]);
});
其中重要的部分是我想使用“登录”而不是“姓名”。
接下来我将 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 的帖子,但没有找到任何可以帮助我的帖子。
例如https://laracasts.com/discuss/channels/laravel/change-name-column-to-username-in-auth
【问题讨论】:
-
protected $primaryKey = 'login';删除它,您的主键为 id...getAuthIdentifierName()方法也是如此。迁移:如果您已经有一些用户使用重命名方法,如果您没有任何用户并且仍在开发中,请忘记新的迁移,只需更改默认迁移即可。 -
成功了,谢谢! :)
-
@Kyslik 留下您的评论作为答案!这样,更多有相同问题的人可以更快地看到答案!
-
@Jsleshem 我认为这个问题只是缺乏文档时间。也许我明天会写一个扩展版本。感谢您指出。
-
@Jsleshem 你去 :)
标签: php laravel authentication laravel-5.4