我必须通过外部api(类似于ldap)对用户进行身份验证,并且一直在尝试通过https://laravel.com/docs/master/authentication#closure-request-guards
中所述的关闭请求防护来实现身份验证。如果用户正确登录,它会很好地工作,但是在身份验证失败时,如果失败的尝试从闭包返回https://laravel.com/docs/master/authentication#closure-request-guards
,则laravel会抛出所提到的错误null
(如文档中所述)。如果仅返回false,则laravel不会抛出错误,但是没有验证反馈。
Auth::viaRequest('ldap', function ($request) {
$credentials = $request->only('login_id', 'password');
if ($user = ExternalLDPAAuth::auth()) {
return $user;
} else {
return null; // laravel throws error
// return false; // <- would not throw error, but no validation
}
}
是否有更简单的方法来进行自定义身份验证?
我不太了解https://laravel.com/docs/5.7/authentication#authenticating-users的文档
最后我还是要像上面一样写警卫,对吧?
答案 0 :(得分:0)
您尚未在调用iframe {
float: right;
}
的地方显示代码,但是通过请求进行身份验证时不需要使用该方法。当用户尝试使用凭据登录并且需要显式尝试进行身份验证时,可以使用attempt()
。使用请求身份验证,Laravel将在处理请求时自动尝试进行身份验证,因此您的代码可以简单地检查attempt()
是否返回true。
答案 1 :(得分:0)
最后,我决定自定义EloquentUserProvider而不是后卫。最后,我需要的是用于验证凭据并通过凭据检索用户的其他逻辑,以防用户尚未登录。即首先检查正常的雄辩逻辑,然后检查外部API是否未找到任何内容(还要检查是否更改了密码)。
class CustomUserProvider extends EloquentUserProvider
{
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(UserContract $user, array $credentials)
{
// (...)
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
// (...)
}
}
// config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'custom',
],
// (...)
],
// providers/AuthServiceProvider.php
class AuthServiceProvider extends ServiceProvider
{
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Auth::provider('custom', function ($app, array $config) {
return new CustomUserProvider($app['hash'], $config['model']);
});
}
}