标识符

标识符将根据身份验证器从请求中提取的信息来识别用户或服务。标识符可以在 loadIdentifier 方法中接受选项。一个完整的密码标识符的使用示例如下:

$service->loadIdentifier('Authentication.Password', [
    'fields' => [
        'username' => 'email',
        'password' => 'passwd',
    ],
    'resolver' => [
        'className' => 'Authentication.Orm',
        'userModel' => 'Users',
        'finder' => 'active', // default: 'all'
    ],
    'passwordHasher' => [
        'className' => 'Authentication.Fallback',
        'hashers' => [
            'Authentication.Default',
            [
                'className' => 'Authentication.Legacy',
                'hashType' => 'md5',
            ],
        ],
    ],
]);

密码

密码标识符将传入的凭据与数据源进行比对。

配置选项

  • fields: 用于查找的字段。默认值为 ['username' => 'username', 'password' => 'password']。您也可以将 username 设置为数组。例如,使用 ['username' => ['username', 'email'], 'password' => 'password'] 将允许您匹配用户名或电子邮件列的值。

  • resolver: 身份解析器。默认值为 Authentication.Orm,它使用 CakePHP ORM。

  • passwordHasher: 密码哈希器。默认值为 DefaultPasswordHasher::class

令牌

将传入的令牌与数据源进行比对。

配置选项

  • tokenField: 数据库中要比对的字段。默认值为 token

  • dataField: 传入的身份验证器数据中的字段。默认值为 token

  • resolver: 身份解析器。默认值为 Authentication.Orm,它使用 CakePHP ORM。

  • hashAlgorithm: 在将传入的令牌与 tokenField 进行比对之前,用于对传入的令牌进行哈希的算法。推荐的值为 sha256。默认值为 null

JWT 主题

将传入的 JWT 令牌与数据源进行比对。

配置选项

  • tokenField: 数据库中要比对的字段。默认值为 id

  • dataField: 用于从有效负载中获取用户标识符的键。默认值为 sub

  • resolver: 身份解析器。默认值为 Authentication.Orm,它使用 CakePHP ORM。

LDAP

将传入的凭据与 LDAP 服务器进行比对。此标识符需要 PHP LDAP 扩展。

配置选项

  • fields: 用于查找的字段。默认值为 ['username' => 'username', 'password' => 'password']

  • host: LDAP 服务器的 FQDN。

  • port: LDAP 服务器的端口。默认为 389

  • bindDN: 用于身份验证的用户的名区分名称。必须是一个可调用对象。不支持匿名绑定。

  • ldap: 扩展适配器。默认为 \Authentication\Identifier\Ldap\ExtensionAdapter。如果您的对象/类名实现了 AdapterInterface,您可以在此处传入它。

  • options: 额外的 LDAP 选项数组,包括

    tls: 布尔值。如果为 true,则尝试在连接上启动 TLS。还包括 LDAP 配置选项,例如 LDAP_OPT_PROTOCOL_VERSIONLDAP_OPT_NETWORK_TIMEOUT。有关更多有效选项,请参见

    php.net

回调

允许您使用回调进行身份验证。这对于简单的标识符或快速原型设计非常有用。

配置选项

  • callback: 默认值为 null,并将引发异常。您需要将一个有效的回调传入此选项才能使用身份验证器。

回调标识符可以返回 null|ArrayAccess 用于简单结果,或者返回 Authentication\Authenticator\Result 如果您想转发错误消息

// A simple callback identifier
$authenticationService->loadIdentifier('Authentication.Callback', [
    'callback' => function($data) {
        // do identifier logic

        // Return an array of the identified user or null for failure.
        if ($result) {
            return $result;
        }

        return null;
    },
]);

// Using a result object to return error messages.
$authenticationService->loadIdentifier('Authentication.Callback', [
    'callback' => function($data) {
        // do identifier logic

        if ($result) {
            return new Result($result, Result::SUCCESS);
        }

        return new Result(
            null,
            Result::FAILURE_OTHER,
            ['message' => 'Removed user.']
        );
    },
]);

身份解析器

身份解析器为不同的数据源提供适配器。它们允许您控制要搜索哪些源身份。它们与标识符分开,以便它们可以独立于标识符方法(表单、jwt、基本身份验证)进行交换。

ORM 解析器

CakePHP ORM 的身份解析器。

配置选项

  • userModel: 身份所在的用户模型。默认值为 Users

  • finder: 要与模型一起使用的查找器。默认值为 all。您可以在 此处 阅读有关模型查找器的更多信息。

为了使用 ORM 解析器,您必须在您的 composer.json 文件中(如果您还没有使用完整的 CakePHP 框架)要求 cakephp/orm

编写自己的解析器

通过创建解析器,可以将任何 ORM 或数据源适配到身份验证。解析器必须实现 Authentication\Identifier\Resolver\ResolverInterface,并且应该位于 App\Identifier\Resolver 命名空间下。

解析器可以使用 resolver 配置选项进行配置

$service->loadIdentifier('Authentication.Password', [
    'resolver' => [
         // can be a full class name: \Some\Other\Custom\Resolver::class
        'className' => 'MyResolver',
        // Pass additional options to the resolver constructor.
        'option' => 'value',
    ],
]);

或者使用 setter 进行注入

$resolver = new \App\Identifier\Resolver\CustomResolver();
$identifier = $service->loadIdentifier('Authentication.Password');
$identifier->setResolver($resolver);