将自定义 user/login 提供程序实施到 Bolt cms

Implementing custom user/login provider into Bolt cms

我目前正在评估更改 Bolt 用户提供程序和相关视图以使用某些自定义 user/login 服务的选项。到目前为止,我似乎不得不修改 Bolt 源代码的一些核心元素,这显然是一个错误的选择:

关于如何以对核心源代码的影响最小的方式进行此操作有什么想法吗?

这很大程度上取决于您想要更改多少,但正如您提到的,在 Silex 中更换服务非常简单,您需要做的就是:

<?php
namespace Custom;
use Bolt\Users;
// src/Custom/UserService
class UserService extends Users {}

然后在您的 bootstrap 中执行如下操作。

<?php
// public/index.php
require_once "../vendor/autoload.php";
$configuration = new Bolt\Configuration\Composer(dirname(__DIR__));
$app = new Bolt\Application(array('resources'=>$configuration));
$app['users'] = new Custom\UserService($app);
$app->initialize();
$app->run();

现在您的自定义用户服务可以决定覆盖哪些核心 Bolt 方法。

由于 Bolt 服务架构目前还没有覆盖某些核心功能所需的那么干净,并且由于它目前正在为 Symfony 5 Flex 重写,因为路径现在并不真正可行。

但是!几个月以来,Bolt 的用户服务中有一个新的 loginAsUser 方法。您现在可以选择使用 Bolt 的用户库创建自己的用户,然后以该用户身份登录。

以下是您可以在扩展中改编和使用的一些示例代码片段:

注意:这是不完整的示例代码。由于 modifying/bypassing 登录系统存在风险,建议您充分阅读并理解 Bolt 的用户和授权服务。 此外,此代码使用的内部方法不适用于扩展,可能会更改。这样做需要您自担风险并使用谨慎的错误处理。

创建用户

/* @var Repository\UsersRepository $repository */
$repository = $this->app["storage"]->getRepository(Users::class);
$userEntity = new Users();
... set user attributes ...
$repository->save($userEntity);

以用户身份登录

$event = new AccessControlEvent($request);
$this->login()->loginAsUser($user->getEmail(), $event);
$token = $this->session()->get('authentication');
$response = $this->setAuthenticationCookie($request, $response, (string) $token);