方法Illuminate \ Auth \ RequestGuard :: attempt不存在。通过网络路由尝试自定义身份验证时

时间:2019-02-21 01:56:51

标签: laravel laravel-5.7

我必须通过外部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的文档 最后我还是要像上面一样写警卫,对吧?

2 个答案:

答案 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']);
        });
    }

}