在 Bolt cms 中实现自定义用户/登录提供程序


Implementing custom user/login provider into Bolt cms

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

  • Users服务替换为自定义类(相同接口)
  • 更改/扩展类Backend因为它正在路由和呈现关联的视图本身

关于如何在对核心源代码影响最小的情况下做到这一点的任何想法?

这在很大程度上取决于你想要改变多少,但正如你提到的,在Silex中交换服务非常容易,你需要做的就是:

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

然后在引导程序中执行以下操作。

<?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 的用户存储库创建自己的用户,然后以该用户身份登录。

下面是一些可以在扩展中调整和使用的示例代码截图:

注意:这是不完整的示例代码。由于修改/绕过登录系统是有风险的,因此建议充分阅读并理解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);