_defaultConfig['lockoutHandler'] = [ 'className' => LockoutHandler::class, ]; parent::__construct($config); } /** * @inheritDoc */ protected function _checkPassword(ArrayAccess|array|null $identity, ?string $password): bool { if (!isset($identity['id'])) { return false; } $check = parent::_checkPassword($identity, $password); $handler = $this->getLockoutHandler(); if (!$check) { $handler->newFail($identity['id']); return false; } return $handler->isUnlocked($identity); } /** * @return \CakeDC\Users\Identifier\PasswordLockout\LockoutHandlerInterface */ protected function getLockoutHandler(): LockoutHandlerInterface { if ($this->lockoutHandler !== null) { return $this->lockoutHandler; } $config = $this->getConfig('lockoutHandler'); if ($config !== null) { $this->lockoutHandler = $this->buildLockoutHandler($config); return $this->lockoutHandler; } throw new \RuntimeException(__d('cake_d_c/users', 'Lockout handler has not been set.')); } /** * @param array|string $config * @return \CakeDC\Users\Identifier\PasswordLockout\LockoutHandlerInterface */ protected function buildLockoutHandler(array|string $config): LockoutHandlerInterface { if (is_string($config)) { $config = [ 'className' => $config, ]; } if (!isset($config['className'])) { throw new \InvalidArgumentException( __d( 'cake_d_c/users', 'Option `className` for lockout handler is not present.', ), ); } $className = $config['className']; return new $className($config); } }