Многократные брандмауэры с одинаковым шаблоном

#symfony #api-platform.com #lexikjwtauthbundle

#симфония #api-platform.com #lexikjwtauthbundle

Вопрос:

В настоящее время у меня есть следующая конфигурация, конечные точки / api работают нормально при отправке токена от внешних потребителей.

Но теперь я хочу повторно использовать этот шаблон ^/api с ajax в моем приложении, использующем сеансы. Как я могу настроить брандмауэр так, чтобы он работал для меня либо без состояния, либо с сеансами?

 security:
    encoders:
        FOSUserBundleModelUserInterface: bcrypt
        AppEntityUserUser:
            algorithm: bcrypt

    role_hierarchy:
        ROLE_ADMIN: [ROLE_USER, ROLE_ALLOWED_TO_SWITCH]
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email
        app_user_provider:
            entity:
                class: AppEntityUserUser
                property: username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        logout:
            pattern: ^/api/logout
            stateless: true
            anonymous: true
            logout:
                path:  app_logout
                success_handler: "app.webservice_logout_success_listener"
        api:
            pattern: ^/api
            stateless: true
            anonymous: true
            provider: app_user_provider
            json_login:
                check_path: /api/login_check
                username_path: username
                password_path: password
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
            guard:
                authenticators:
                    - lexik_jwt_authentication.jwt_token_authenticator
        admin:
            context: user
            switch_user: true
            pattern:  ^/
            anonymous: ~
            provider: fos_userbundle
            form_login:
                login_path: admin_login
                check_path: admin_login
                default_target_path: easyadmin
                failure_path: admin_login
            logout:
                path:   /logout
                target: /login

 

Комментарии:

1. Вы можете настроить службу для сопоставления запросов брандмауэром: symfony.com/doc/current/security /… .

Ответ №1:

Я нашел решение, извините, что потратил время на ответ. Решение Я не знаю, будет ли это лучшим подходом, но я хотел бы узнать мнения о других возможных реализациях.

С одной стороны, я включаю Lexik, чтобы получить токен файла cookie.

 # config/packages/lexik_jwt_authentication.yaml
lexik_jwt_authentication:
    # some_config:
    token_extractors:
        # check token in a cookie
        cookie:
            enabled: true
            name:    Bearer
 

С другой стороны, я переопределяю функцию, когда пользователь проходит аутентификацию с помощью сеанса, устанавливая файл cookie и используя токен, сгенерированный программно с помощью Lexik

 <?php

namespace AppSecurity;

use LexikBundleJWTAuthenticationBundleServicesJWTTokenManagerInterface;
use SymfonyComponentHttpFoundationCookie;
use SymfonyComponentSecurityHttpAuthenticationDefaultAuthenticationSuccessHandler as BaseDefaultAuthenticationSuccessHandler;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;
use SymfonyComponentSecurityHttpHttpUtils;

class DefaultAuthenticationSuccessHandler extends BaseDefaultAuthenticationSuccessHandler
{

    private $JWTManager;

    public function __construct(
        JWTTokenManagerInterface $JWTManager,
        HttpUtils $httpUtils,
        array $options = []
    )
    {
        parent::__construct($httpUtils, $options);
        $this->JWTManager = $JWTManager;
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        /** @var Response $response */
        $response = parent::onAuthenticationSuccess($request, $token);
        $response->headers->setCookie(Cookie::create('Bearer', $this->JWTManager->create($token->getUser())));
        return $response;
    }
}