abenmada / sylius-multi-factor-authentication-plugin
适用于ShopUser和AdminUser的多因素认证插件。
v1.0.1
2024-05-12 19:23 UTC
Requires
- php: ^8.0
- scheb/2fa-bundle: ^v5.13
- scheb/2fa-google-authenticator: ^5.13
- scheb/2fa-qr-code: ^5.13
- sylius/sylius: ^1.12
Requires (Dev)
- behat/behat: ^3.6.1
- behat/mink-selenium2-driver: ^1.4
- dmore/behat-chrome-extension: ^1.3
- dmore/chrome-mink-driver: ^2.7
- friends-of-behat/mink: ^1.8
- friends-of-behat/mink-browserkit-driver: ^1.4
- friends-of-behat/mink-debug-extension: ^2.0.0
- friends-of-behat/mink-extension: ^2.4
- friends-of-behat/page-object-extension: ^0.3
- friends-of-behat/suite-settings-extension: ^1.0
- friends-of-behat/symfony-extension: ^2.1
- friends-of-behat/variadic-extension: ^1.3
- friendsofphp/php-cs-fixer: ^3.9
- phpspec/phpspec: ^7.2
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^1.8.1
- phpstan/phpstan-doctrine: 1.3.40
- phpstan/phpstan-strict-rules: ^1.3.0
- phpstan/phpstan-webmozart-assert: ^1.2.0
- phpunit/phpunit: ^9.5
- polishsymfonycommunity/symfony-mocker-container: ^1.0
- sylius-labs/coding-standard: ^4.2
- symfony/browser-kit: ^5.4 || ^6.0
- symfony/debug-bundle: ^5.4 || ^6.0
- symfony/dotenv: ^5.4 || ^6.0
- symfony/flex: ^2.2.2
- symfony/intl: ^5.4 || ^6.0
- symfony/web-profiler-bundle: ^5.4 || ^6.0
- vimeo/psalm: 4.30.0
README
适用于ShopUser和AdminUser的多因素认证插件
详细信息
在eshop上激活MFA
在eshop登录后进行MFA验证
在后台激活MFA
在后台登录后进行MFA验证
安装
使用Composer安装插件
composer require abenmada/sylius-multi-factor-authentication-plugin
⚠️ 请删除自动生成的文件 config/packages/scheb_2fa.yaml 和 config/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