2017-01-16 25 views
5

Problem Mam, gdy użytkownik zmienia język na stronie logowania - działa, ale po zalogowaniu się użytkownika - ponownie wraca do ustawień domyślnych. Jak umożliwić zachowanie tego samego użytkownika języka wybranego przed zalogowaniem, aby pozostać po zalogowaniu? Próbowałem sprawdzając to na stackoverflow, ale nie był w stanie znaleźć żadnego wyniku pracy.Symfony3 Przechowywanie lokalizacji po zalogowaniu

security.yml:

security: 

    encoders: 
     AppBundle\Entity\User: 
      algorithm: bcrypt 

    role_hierarchy: 
     ROLE_ADMIN: ROLE_PREMIUM 
     ROLE_PREMIUM: ROLE_USER 

    providers: 
     our_db_provider: 
      entity: 
       class: AppBundle:User 
       property: email 

     in_memory: 
      memory: ~ 

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

     main: 
      anonymous: ~ 

      form_login: 
       #galima nurodyti kur nukreipia loginas 
       login_path: login 
       check_path: login 
       csrf_token_generator: security.csrf.token_manager 
      logout: 
       path: /logout 

      pattern: ^/ 
      http_basic: ~ 
      provider: our_db_provider 
      access_denied_url: homepage 

routing.yml

app: 
    resource: "@AppBundle/Controller/" 
    type:  annotation 
    prefix: /{_locale} 
    requirements: 
     _locale: lt|en|ru 

root: 
    path:/
    defaults: 
     _controller: FrameworkBundle:Redirect:urlRedirect 
     path: /%locale%/ 
     permanent: true 

login: 
    path: /{_locale}/login 
    defaults: { _controller: AppBundle:Security:login } 
    requirements: 
     _method: GET 
     _locale: lt|en|ru 

logout: 
    path: /logout 
    defaults: 
     _controller: FrameworkBundle:Redirect:urlRedirect 
     path: /{_locale}/login 
     permanent: true   

register: 
    path: /{_locale}/register 
    defaults: { _controller: AppBundle:Registration:register } 
    requirements: 
     _method: GET 
     _locale: lt|en|ru     

Język zmieniona przez:

<ul class="top-menu-list top-menu-languages"> 
    <li><a href="{{ path(app.request.attributes.get('_route'), app.request.query.all|merge({'_locale': 'lt'})) }}">LT</a></li> 
    <li><a href="{{ path(app.request.attributes.get('_route'), app.request.query.all|merge({'_locale': 'en'})) }}">EN</a></li> 
    <li><a href="{{ path(app.request.attributes.get('_route'), app.request.query.all|merge({'_locale': 'ru'})) }}">RU</a></li> 
</ul> 

jakieś pomysły lub E xamples byłyby docenione!

+0

Użyj słuchacza logowania użytkownika i przekierować do odsyłający: http://stackoverflow.com/questions/11180351/symfony2-after-successful-login-event-perform-set-of- akcje – COil

+0

Cały przykład jest przestarzały już dawno temu ... – JustinasT

+0

http://symfony.com/doc/current/components/security/authentication.html#authentication-events – COil

Odpowiedz

3

Domyślnie komponent zabezpieczający zachowuje informacje z ostatniego żądania URI (np /en/admin) w zmiennej sesji o nazwie _security.main.target_path (z main jest nazwa firewall, określonym w security.yml). Po pomyślnym zalogowaniu użytkownik zostaje przekierowany do tej ścieżki, aby pomóc im w kontynuowaniu od ostatniej znanej strony, którą odwiedzili.

Note: No matter how many times the language is changed on the login page, because the firewall always redirect to /en/admin/ after success login, so the locale changes again to en .

Aby ustalić, że może trzeba change the default Target Path Behavior:

wyjątkiem Listener klasy:

// src/AppBundle/Security/Firewall/ExceptionListener.php 

use Symfony\Component\Security\Http\Firewall\ExceptionListener as BaseExceptionListener; 

class ExceptionListener extends BaseExceptionListener 
{ 
    use TargetPathTrait; 

    protected function setTargetPath(Request $request) 
    { 
     if ($request->hasSession() && $request->isMethodSafe(false) && !$request->isXmlHttpRequest()) { 
      $this->saveTargetPath(
       $request->getSession(), 
       // the firewall name 
       'admin', 
       // save the route name instead of the URI 
       $request->attributes->get('_route') 
      ); 
     } 
    } 
} 

to wygenerowanie starą trasą Po zalogowaniu z bieżącej lokalizacji.

Konfiguracja:

Dla Symfony 2:

# app/config/services.yml 
parameters: 
    # ... 
    security.exception_listener.class: AppBundle\Security\Firewall\ExceptionListener 

Dla Symfony 3:

Być może trzeba stworzyć podanie kompilatora i ręcznie zmienić tę klasę:

// src/AppBundle/DependencyInjection/Compiler/ExceptionListenerPass.php; 

class ExceptionListenerPass implements CompilerPassInterface 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function process(ContainerBuilder $container) 
    { 
     $definition = $container->getDefinition('security.exception_listener.admin'); 
     $definition->setClass('AppBundle\Security\Firewall\ExceptionListener'); 
    } 
} 

Wreszcie zarejestruj kompilator przechodzą w wiązce:

// src/AppBundle/AppBundle.php 

class AppBundle extends Bundle 
{ 
    public function build(ContainerBuilder $container) 
    { 
     $container->addCompilerPass(new ExceptionListenerPass()); 
    } 
} 
+0

Twoje rozwiązanie przekierowuje użytkownika do strony, która jest ustawiona. Muszę być w stanie przekierować użytkownika irl. do którego próbował uzyskać dostęp przed zalogowaniem. Na przykład próbuję uzyskać dostęp do witryny internetowej.com/en/about - nastąpi przekierowanie do ekranu logowania. na ekranie logowania zmieniam język na ru, a po zalogowaniu powinienem zostać przekierowany do witryny internetowej.com/ru/about – JustinasT

+0

Jeśli używasz Symfony2, druga część to rozwiązanie, którego szukasz. – yceruto

+0

Zaktualizowałem moją odpowiedź prostszym rozwiązaniem dla Symfony3 :) – yceruto