Локаль Symfony3 после входа в систему (перенаправление на локаль по умолчанию)

У меня проблема в проекте Symfony с версией Symfony 3.1.10. Мне нужно закончить перевод этого проекта, и это моя первая встреча с Symfony.

В чем проблема: У меня два языка DE и EN, язык по умолчанию - DE. Когда кто-то переходит на страницу входа или домашнюю страницу (где также находится форма входа) и переключается на EN и входит для входа в систему, он меняет языковой стандарт на / de / язык по умолчанию после входа в систему. Я потратил несколько дней на эту ошибку, и мне действительно нужна помощь. Все перепробовала, но прогресса все равно нет.

Я следил за документацией Symfony, как настроить перевод, как использовать сеанс пользователя Sticky, и я создал все то же самое, но ошибка снова возникла. Я покажу свой код ниже:

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }

parameters:
    locale: de
framework:
    #esi:             ~
    translator:      { fallbacks: ["%locale%"] }
    default_locale:  "%locale%"

приложение / config / routing.yml

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

app:
    resource: "@AppBundle/Controller/"
    type:     annotation

proreg:
    path:     /{_locale}/product/registration
    defaults:  { _controller: ProductRegistration\Controller\ProductRegistrationController::productRegistrationAction }
prolist:
    path:     /{_locale}/profile/products
    defaults:  { _controller: ProductRegistration\Controller\ProductRegistrationController::listAction }
prodel:
    path:     /{_locale}/profile/products/delete/{id}
    defaults:  { _controller: ProductRegistration\Controller\ProductRegistrationController::deleteAction }
proadd:
    path:     /{_locale}/product/register
    defaults:  { _controller: ProductRegistration\Controller\ProductRegistrationController::createAction }

приложение / config / security.yml

security:
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                login_path:   fos_user_security_login
                # csrf_token_generator: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
                always_use_default_target_path: false
            logout:       true
            anonymous:    true
            # http_basic: ~
            # http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate

            # form_login: ~
            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html

    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }
        - { path: ^/sso/login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/sso/settoken, role: ROLE_ADMIN }
        - { path: ^/profile/products, role: ROLE_ADMIN }
        - { path: ^/product/registration, role: ROLE_ADMIN }

приложение / Ресурсы / FOSUserBundle / all.xml

<?xml version = "1.0" encoding = "UTF-8" ?>

<routes xmlns = "http://symfony.com/schema/routing"
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation = "http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <import
        resource = "@FOSUserBundle/Resources/config/routing/security.xml"/>
    <import
        resource = "@FOSUserBundle/Resources/config/routing/profile.xml"
        prefix = "/{_locale}/profile" />
    <import
        resource = "@FOSUserBundle/Resources/config/routing/registration.xml"
        prefix = "/{_locale}/register" />
    <import
        resource = "@FOSUserBundle/Resources/config/routing/resetting.xml"
        prefix = "/{_locale}/resetting" />
    <import
        resource = "@FOSUserBundle/Resources/config/routing/change_password.xml"
        prefix = "/{_locale}/profile" />
</routes>

приложение / Ресурсы / FOSUserBundle / security.xml

<?xml version = "1.0" encoding = "UTF-8" ?>

<routes xmlns = "http://symfony.com/schema/routing"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id = "fos_user_security_login" path = "/{_locale}/login" methods = "GET POST">
        <default key = "_controller">FOSUserBundle:Security:login</default>
    </route>

    <route id = "fos_user_security_check" path = "/login_check" methods = "POST">
        <default key = "_controller">AppBundle:Security:check</default>
    </route>

    <route id = "fos_user_security_logout" path = "/logout" methods = "GET POST">
        <default key = "_controller">FOSUserBundle:Security:logout</default>
    </route>

</routes>

SRC / AppBundle / Контроллер / DefaultController.php

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Security;
use Symfony\Bundle\SecurityBundle\SecurityBundle;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;

class DefaultController extends Controller
{
    /**
     * @Route("/{_locale}", name = "homepage", defaults = {"_locale": "de"})
     */
    public function indexAction(Request $request)
    {
        // replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
        ]);
    }

SRC / AppBundle / Контроллер / SecurityController.php

<?php

/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

// src/UserBundle/Controller/SecurityController.php
namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use FOS\UserBundle\Controller\SecurityController as BaseController;

class SecurityController extends BaseController
{
    public function loginAction(Request $request)
    {
        $response = parent::loginAction(request);

        // ... do custom stuff

      $errors->messageData = "Test";
      $errors->messageKey = "test";

        $error = $error ? $error : $errors;
        return $this->renderLogin(array(
            'last_username' => $lastUsername,
            'error' => $error,
            //'csrf_token' => $csrfToken,
            'origin' => $request->get("origin")));
    }
    public function checkAction()
    {
        $response = parent::checkAction();
        die  ("<pre>" .print_r($response). "</pre>");
    }
}

SRC / AppBundle / Событие / LocaleListener.php

// src/AppBundle/LocaleListener.php
namespace AppBundle\Event;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    public function __construct($defaultLocale = 'de')
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
       $request = $event->getRequest();
       if (!$request->hasPreviousSession()) {
           return;
        }
        //print_r($request->get('_locale'));
        // try to see if the locale has been set as a _locale routing parameter
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // if no explicit locale has been set on this request, use one from the session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered after the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
        );
    }
}

форма входа

<form action = "{{ path("fos_user_security_check") }}" method = "post" id = "login-form" class = "col-xs-12">
<div class = "content">
   <h2>{{ 'index.login.regcust'|trans }}</h2>
   <p>{{ 'index.login.haveaccount'|trans }}</p>
   <ul class = "form-list">
      <li class = "form_element">
         <label for = "email" class = "required">{{ 'index.login.email'|trans }}<em>*</em></label>
         <div class = "input-box"> 
            <input type = "hidden" name = "origin" value = "{{ origin }}" />
            <input type = "hidden" name = "_target_path" value = "{{ path("setSSOToken") }}" />
            <input type = "email" name = "_username" value = "" id = "username" class = "input-text required-entry validate-email" title = "{{ 'index.login.email'|trans }}">
         </div>
      </li>
      <li class = "form_element">
         <label for = "pass" class = "required">{{ 'index.login.password'|trans }}<em>*</em></label>
         <div class = "input-box input-box-password">
            <input type = "password" name = "_password" class = "input-text required-entry" id = "password" title = "{{ 'index.login.password'|trans }}">
            <!--a href = "" class = "f-left forgot-password">{{ 'index.login.forgot'|trans }}</a-->
         </div>
      </li>
   </ul>
   <p class = "required required_hint">
      <em>*</em> {{ 'index.login.required'|trans }}
   </p>
</div>
<div class = "buttons-set">
   <div class = "button_wrapper">
      <button type = "submit" class = "button" title = "Anmelden" name = "send" id = "send2"><span><span>{{ 'index.login.submit'|trans }}</span></span></button>
   </div>
</div>
</form>

Если кто-то поможет мне решить эту проблему, буду очень признателен. Спасибо

это происходит только после входа в систему?

Federkun 01.04.2018 12:34

Да, только после входа в систему или выхода из системы

Milovan Gibaca 01.04.2018 12:36

это должно быть значение по умолчанию, но можно ли добавить session_fixation_strategy: migrate в security: в app/config/security.yml?

Federkun 01.04.2018 12:40

также, можете ли вы показать html-форму на странице /{_locale}/login?

Federkun 01.04.2018 12:47

Я добавил session_fixation_strategy: мигрировать в условиях безопасности, но все та же проблема. Также я обновил рассматриваемый код, проверьте форму входа. Спасибо

Milovan Gibaca 01.04.2018 13:38

Если вы используете always_use_default_target_path: true, у вас все еще есть эта проблема?

Federkun 01.04.2018 13:43

Затем он перенаправляется на домашнюю страницу, но с языком по умолчанию DE. Все та же проблема.

Milovan Gibaca 01.04.2018 14:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
943
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я уверен, что это связано с вашей конфигурацией. Попробуем еще раз программно:

1) В src / AppBundle / Event / LocaleListener.php измените

namespace AppBundle\Event;

к

namespace AppBundle\EventListener;

и убедитесь, что он зарегистрирован согласно https://symfony.com/doc/3.1/session/locale_sticky_session.html:

services:
app.locale_listener:
    class: AppBundle\EventListener\LocaleListener
    arguments: ['%kernel.default_locale%']
    tags:
        - { name: kernel.event_subscriber }

2) Удалить

/{_locale}

из app / Resources / FOSUserBundle / security.xml и добавьте

prefix = "/{_locale}"

к

<import
    resource = "@FOSUserBundle/Resources/config/routing/security.xml"

в приложении / Resources / FOSUserBundle / all.xml. Это в основном просто для хранения конфигурации в одном месте.

3) Убедитесь, что у вас есть

firewalls:
    main:
        form_login:
            login_path: fos_user_security_login
            check_path: fos_user_security_check
            default_target_path: <your_desired_route>
        logout:
            path: fos_user_security_logout

в app / config / security.yml с локалью.

4) В app / config / security.yml вы должны указать правильные пути для access_control:

access_control:
    - { path: ^/(en|de)/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/admin/, role: ROLE_ADMIN }
    - { path: ^/(en|de)/sso/login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/sso/settoken, role: ROLE_ADMIN }
    - { path: ^/(en|de)/profile/products, role: ROLE_ADMIN }
    - { path: ^/(en|de)/product/registration, role: ROLE_ADMIN }

включая регионы. В противном случае эти пути не будут защищены брандмауэром. Также вы должны убедиться, что регистрация, сброс и любые другие маршруты соответствуют маршрутам в FOSUserBundle.

Редактировать

Похоже, это было связано с другим контроллером, который изменил поведение FOSUserBundle.

Другие вопросы по теме