Laravel8使用Laratrust鉴权新增status=1验证条件报语法错误如何解决
问题原因
你的代码存在两处错误:
- 语法错误:PHP数组键值对的关联符号为
=>,你错误写成了对象调用的->,直接触发语法报错 - 逻辑错误:
$this->only()方法仅能传入请求参数的字段名,从用户提交的请求中提取对应值,无法直接设置固定的status=1条件
修复方案
方案1:直接在校验凭证中加入固定status条件(最简单)
直接手动构造登录凭证数组,添加固定的status=1参数后传给Auth::attempt()即可,修正后代码如下:
public function authenticate() { $this->ensureIsNotRateLimited(); // 构造校验凭证,合并请求参数和固定status条件 $credentials = $this->only('email', 'password'); $credentials['status'] = 1; if (! Auth::attempt($credentials, $this->boolean('remember'))) { RateLimiter::hit($this->throttleKey()); throw ValidationException::withMessages([ 'email' => __('auth.failed'), ]); } RateLimiter::clear($this->throttleKey()); }
方案2:分步骤校验,区分错误提示(体验更优)
如果需要区分「密码错误」和「账号被禁用」的不同提示,可以先单独校验账号状态,再校验密码:
public function authenticate() { $this->ensureIsNotRateLimited(); $user = \App\Models\User::where('email', $this->input('email'))->first(); // 单独校验账号状态 if ($user && $user->status != 1) { throw ValidationException::withMessages([ 'email' => '该账号已被禁用,请联系管理员', ]); } // 校验账号密码 if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { RateLimiter::hit($this->throttleKey()); throw ValidationException::withMessages([ 'email' => __('auth.failed'), ]); } RateLimiter::clear($this->throttleKey()); }
内容的提问来源于stack exchange,提问作者saadia
相关产品推荐
相关产品推荐

