abenmada/sylius-multi-factor-authentication-plugin

适用于ShopUser和AdminUser的多因素认证插件。


README

适用于ShopUser和AdminUser的多因素认证插件

详细信息

在eshop上激活MFA

presentation photo

在eshop登录后进行MFA验证

presentation photo

在后台激活MFA

presentation photo

在后台登录后进行MFA验证

presentation photo

安装

使用Composer安装插件

composer require abenmada/sylius-multi-factor-authentication-plugin

⚠️ 请删除自动生成的文件 config/packages/scheb_2fa.yamlconfig/routes/scheb_2fa.yaml.

修改你的 config/bundles.php 文件以添加插件的行

<?php

return [
    //..
    Abenmada\MultiFactorAuthenticationPlugin\MultiFactorAuthenticationPlugin::class => ['all' => true],
    Scheb\TwoFactorBundle\SchebTwoFactorBundle::class => ['all' => true],
];

然后在 config/packages/abenmada_multi_factor_authentication_plugin.yaml 中创建配置文件

imports:
    - { resource: "@MultiFactorAuthenticationPlugin/Resources/config/services.yaml" }

然后导入路由到 config/routes/abenmada_multi_factor_authentication_plugin.yaml

abenmada_multi_factor_authentication_plugin_shop_routing:
    resource: "@MultiFactorAuthenticationPlugin/Resources/config/routes/sylius_shop.yaml"
    prefix: /{_locale}

abenmada_multi_factor_authentication_plugin_admin_routing:
    resource: "@MultiFactorAuthenticationPlugin/Resources/config/routes/sylius_admin.yaml"
    prefix: /%sylius_admin.path_name%

修改你的 config/services.yaml 文件

parameters:
    abenmada_multi_factor_authentication_plugin_issuer: "Fashion Web Store" # Issuer name used in QR code

修改你的 config/packages/security.yaml 文件

security:
    firewalls:
        admin:
            two_factor:
                auth_form_path: abenmada_multi_factor_authentication_plugin_admin_user_login
                check_path: abenmada_multi_factor_authentication_plugin_admin_user_login_check

        shop:
            two_factor:
                auth_form_path: abenmada_multi_factor_authentication_plugin_shop_user_login
                check_path: abenmada_multi_factor_authentication_plugin_shop_user_login_check

    access_control:
        # This makes the logout route accessible during two-factor authentication. Allows the user to cancel two-factor authentication, if they need to.
        - { path: ^/logout, role: IS_AUTHENTICATED_ANONYMOUSLY }

        # This ensures that the form can only be accessed when two-factor authentication is in progress.
        - { path: ^/2fa, role: IS_AUTHENTICATED_2FA_IN_PROGRESS }

templates/bundles/SyliusAdminBundle/Layout/_security.html.twig 文件中添加一个新标签页(如果不存在,请自定义它)

<a href="{{ path('abenmada_multi_factor_authentication_plugin_admin_user_enable', {'id': app.user.id}) }}" class="item">
    <i class="shield icon"></i>
    {{ 'abenmada_multi_factor_authentication_plugin.ui.multi_factor_authentication'|trans }}
</a>

自定义账户菜单

<?php

declare(strict_types=1);

namespace App\Menu\Listener;

use Sylius\Bundle\UiBundle\Menu\Event\MenuBuilderEvent;

final class AccountMenuListener
{
    public function invoke(MenuBuilderEvent $event): void
    {
        $menu = $event->getMenu();

        $menu
            ->addChild('multiFactorAuthentication', ['route' => 'sylius_shop_account_abenmada_multi_factor_authentication_plugin_shop_user_enable'])
            ->setLabel('abenmada_multi_factor_authentication_plugin.ui.multi_factor_authentication')
            ->setLabelAttribute('icon', 'shield');
    }
}
services:
    app.listener.account_menu:
        class: App\Menu\Listener\AccountMenuListener
        tags:
            - { name: kernel.event_listener, event: sylius.menu.shop.account, method: invoke }

更新实体 src/Entity/User/AdminUser.php

<?php

declare(strict_types=1);

namespace App\Entity\User;

use Abenmada\MultiFactorAuthenticationPlugin\Model\MultiFactorAuthenticationTrait;
use Doctrine\ORM\Mapping as ORM;
use Scheb\TwoFactorBundle\Model\Google\TwoFactorInterface;
use Sylius\Component\Core\Model\AdminUser as BaseAdminUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="sylius_admin_user")
 */
#[ORM\Entity]
#[ORM\Table(name: 'sylius_admin_user')]
class AdminUser extends BaseAdminUser implements TwoFactorInterface
{
    use MultiFactorAuthenticationTrait;

    public function getGoogleAuthenticatorUsername(): string
    {
        return $this->getEmail() ?: '';
    }
}

更新实体 src/Entity/User/ShopUser.php

<?php

declare(strict_types=1);

namespace App\Entity\User;

use Abenmada\MultiFactorAuthenticationPlugin\Model\MultiFactorAuthenticationTrait;
use Doctrine\ORM\Mapping as ORM;
use Scheb\TwoFactorBundle\Model\Google\TwoFactorInterface;
use Sylius\Component\Core\Model\ShopUser as BaseShopUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="sylius_shop_user")
 */
#[ORM\Entity]
#[ORM\Table(name: 'sylius_shop_user')]
class ShopUser extends BaseShopUser implements TwoFactorInterface
{
    use MultiFactorAuthenticationTrait;

    public function getGoogleAuthenticatorUsername(): string
    {
        return $this->getEmail() ?: '';
    }
}

运行迁移

bin/console doctrine:migrations:migrate

安装资源

bin/console assets:install --ansi