【发布时间】:2021-06-22 06:29:17
【问题描述】:
我已成功创建custom user provider 并实现了用户界面。
我正在尝试将用户对象保存到从第三方后端返回的本地 Postgres 数据库中。
这是我的retrieveByCredentials 方法的样子:
// MyCustomUserProvider.php
public function retrieveByCredentials(array $credentials) {
if (empty($credentials)) {
return null;
}
try {
$response = Http::asForm()
->retry(3, 100)
->timeout(5)
->post('https://my-custom-auth-endpoint', $credentials)
->json();
if ($response) {
$user = User::firstOrNew([
'foo' => $response['foo'],
]);
$user->save();
return $user;
}
} catch (RequestException $e) {
Log::info('-----------------------------------------------------------');
Log::info(print_r($e->getMessage(), true));
Log::info('-----------------------------------------------------------');
return $e->getMessage();
}
}
...
public function validateCredentials(Authenticatable $user, array $credentials): bool {
return strtoupper($user->foo) === strtoupper($credentials['foo']);
}
到目前为止,一切都运行良好。我正在为每个必需的方法获取正确的值/布尔值。但是,我需要能够向我的控制器返回额外的信息,而不仅仅是一个布尔值。例如,如果用户的密码已过期,则此信息来自我的第 3 方数据库。到目前为止,在我的LoginController 中返回user 会导致true 或false 响应。如果我从我的CustomProvider 收到false,我可以设置一条“无效凭据”的消息。但这可能并不总是正确的错误。
我是这样称呼CustomUserProvider的:
// LoginController.php
$authenticated = Auth::guard('foo')
->attempt([
'userid' => $request->username,
'password' => $request->password,
]);
// $authenticated is the response from CustomUserProvider.
dd($authenticated) // true or false.
据了解,在我的提供程序中,我只想对用户进行身份验证。如何将经过身份验证的用户返回给控制器?此外,如何将错误返回给控制器,以便显示正确的错误消息?
【问题讨论】: