如何使用HTTP基本身份验证在Laravel中为身份验证查询添加额外条件?

时间:2014-10-28 13:04:55

标签: php authentication laravel http-basic-authentication

我有一条路线:

Route::get('/', array('before' => 'auth.basic', function() {
    return Response::json(
        array(
            'name' => 'John Smith',
            'age' => 42
        )
    );
}));

我想要的是将where active= 1添加到身份验证查询中。

我知道我可以为Auth::attempt()添加额外条件,但我不知道如何使用Auth::basic()执行此操作。

2 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。

1。修改过滤器并使用Auth :: attempt()

这是一个简单的方法。转到app/filter.php并将 auth.basic 条目更改为此

Route::filter('auth.basic', function()
{
    if(Auth::check()) return; // already logged in

    if(Auth::attempt(array(
        'email' => Request::getUser(),
        'password' => Request::getPassword(),
        'active' => 1))){
        return;
    }

    $headers = array('WWW-Authenticate' => 'Basic');
    return Response::make('Invalid credentials.', 401, $headers);
});

这基本上是Laravel Guard课程在Auth::basic()被调用时所做的事情(显然除了活跃的部分)

2。扩展验证

现在,这更优雅了#34;这样做的方式。虽然我不知道在你的情况下它是否真的值得。我也不打算详细描述它。

要扩展Laravel Auth,您可以使用Auth::extend()。这是一个例子:

Auth::extend('my_driver', function() {
    $model = Config::get('auth.model');
    $provider = new Illuminate\Auth\EloquentUserProvider(App::make('hash'), $model);
    return new MyGuard($provider, App::make('session.store'));
});

MyGuard类会扩展Illuminate\Auth\Guard并覆盖getBasicCredentials()方法。最后在config/auth.php设置'driver' => 'my_driver'

如果您选择第二种方法并需要更多帮助,请撰写评论......

答案 1 :(得分:0)

我是如何做到的(Laravel 5.8):

SessionGuard的方法basicbasicOnce接受两个参数:$field(可在其中设置用户名列)和$extraConditions(可在其中设置其他条件)。

您可以扩展AuthenticateWithBasicAuth并覆盖handle方法来获取类似的信息

class CustomBasicAuth extends AuthenticateWithBasicAuth
public function handle($request, Closure $next, $guard = null, $field = null)
{
    $this->auth->guard($guard)->basic('email', ['active' => 1]);

    return $next($request);
}

并且不要忘记注册和使用新的中间件。