# Auth

Testing Is Documentation

tests/Auth/ManagerTest.php

QueryPHP 提供了一组简单的认证组件用于登陆验证,通常我们使用代理 \Leevel\Auth\Proxy\Auth 类进行静态调用。

内置支持的认证驱动类型包括 session、token,分别用于 web 和 api 的认证服务。

# 使用方式

使用容器 auths 服务

\App::make('auths')->login(array $data, ?int $loginTime = null): void;

依赖注入

class Demo
{
    private \Leevel\Auth\Manager $auth;

    public function __construct(\Leevel\Auth\Manager $auth)
    {
        $this->auth = $auth;
    }
}

使用静态代理

\Leevel\Auth\Proxy\Auth::login(array $data, ?int $loginTime = null): void;

# auth 配置

系统的 auth 配置位于应用下面的 option/auth.php 文件。

可以定义多个认证连接,并且支持切换,每一个连接支持驱动设置。

<?php

declare(strict_types=1);

/*
 * This file is part of the your app package.
 *
 * The PHP Application For Code Poem For You.
 * (c) 2018-2099 http://yourdomian.com All rights reserved.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

return [
    /*
     * ---------------------------------------------------------------
     * 默认认证类型
     * ---------------------------------------------------------------
     *
     * 这里可以是 web 或者 api
     */
    'default' => 'api',

    /*
     * ---------------------------------------------------------------
     * 默认 WEB 驱动
     * ---------------------------------------------------------------
     *
     * WEB 认证驱动连接
     */
    'web_default' => 'session',

    /*
     * ---------------------------------------------------------------
     * 默认 API 驱动
     * ---------------------------------------------------------------
     *
     * API 认证驱动连接
     */
    'api_default' => 'token',

    /*
     * ---------------------------------------------------------------
     * auth 连接参数
     * ---------------------------------------------------------------
     *
     * 这里为所有的 auth 的连接参数,每一种不同的驱动拥有不同的配置
     * 虽然有不同的驱动,但是在验证使用上却有着一致性
     */
    'connect' => [
        'session' => [
            // driver
            'driver' => 'session',

            // token
            'token' => 'token',
        ],

        'token' => [
            // driver
            'driver' => 'token',

            // token
            'token' => null,

            // input token
            'input_token' => 'token',
        ],
    ],
];

auth 参数根据不同的连接会有所区别,通用的 auth 参数如下:

配置项 配置描述
web_default WEB 认证驱动连接
api_default API 认证驱动连接

Uses

<?php

use Leevel\Auth\Manager;
use Leevel\Cache\File as CacheFile;
use Leevel\Di\Container;
use Leevel\Di\IContainer;
use Leevel\Http\Request;
use Leevel\Option\Option;
use Leevel\Session\File as SessionFile;

# 认证基本使用

login 原型

# Leevel\Auth\IAuth::login
/**
 * 登录写入数据.
 */
public function login(array $data, ?int $loginTime = null): void;

$loginTime 过期时间规则如下:

  • null 表示默认登陆缓存时间
  • 小与等于 0 表示永久缓存
  • 其它表示缓存多少时间,单位
public function testBaseUse(): void
{
    $manager = $this->createManager();

    $this->assertFalse($manager->isLogin());
    $this->assertSame([], $manager->getLogin());

    $this->assertNull($manager->login(['foo' => 'bar', 'hello' => 'world'], 10));

    $this->assertTrue($manager->isLogin());
    $this->assertSame(['foo' => 'bar', 'hello' => 'world'], $manager->getLogin());

    $this->assertNull($manager->logout());

    $this->assertFalse($manager->isLogin());
    $this->assertSame([], $manager->getLogin());
}

# setTokenName 设置认证名字

public function testWithToken(): void
{
    $manager = $this->createManagerWithToken();

    $manager->setTokenName('token');

    $this->assertFalse($manager->isLogin());
    $this->assertSame([], $manager->getLogin());

    $this->assertNull($manager->login(['foo' => 'bar', 'hello' => 'world'], 10));

    $this->assertTrue($manager->isLogin());
    $this->assertSame(['foo' => 'bar', 'hello' => 'world'], $manager->getLogin());

    $this->assertNull($manager->logout());

    $this->assertFalse($manager->isLogin());
    $this->assertSame([], $manager->getLogin());
}

# setDefaultConnect 设置默认驱动

public function testSetDefaultDriver(): void
{
    $manager = $this->createManagerWithTokenAndSession();

    $manager->setDefaultConnect('token');

    $manager->setTokenName('token');

    $this->assertFalse($manager->isLogin());
    $this->assertSame([], $manager->getLogin());

    $this->assertNull($manager->login(['foo' => 'bar', 'hello' => 'world'], 10));

    $this->assertTrue($manager->isLogin());
    $this->assertSame(['foo' => 'bar', 'hello' => 'world'], $manager->getLogin());

    $this->assertNull($manager->logout());

    $this->assertFalse($manager->isLogin());
    $this->assertSame([], $manager->getLogin());
}