2013-06-20 21 views
8

Sto cercando di far funzionare la commutazione internazionale nella schermata di accesso della mia applicazione. Per farlo ho dei link sulla mia pagina di login che rimandano a site.com/ (il locale predefinito) e site.com/en (il secondo locale che supporto). Non appena ho effettuato l'accesso, la commutazione funziona come un incantesimo. Tuttavia, se non sono ancora autenticato, l'accesso ritorna sempre alle impostazioni locali predefinite. La mia comprensione è che se utilizzo le rotte denominate da FOSUserBundle, dovrebbe essere in grado di gestire automaticamente le impostazioni locali, ma non riesco a farlo funzionare.Impostazioni locali per l'accesso a FOSUserBundle

mia app/config/security.yml

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       login_path: fos_user_security_login 
       check_path: fos_user_security_check 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY }   # allow wdt for debugging 
     - { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging 
     - { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY }  # allow assets to be loaded anonymously 

     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin, role: ROLE_ADMIN } 
     - { path: ^/, role: ROLE_USER } 

mia app/config/routing.yml

# FOS User bundle 
fos_user_security: 
    resource: "@FOSUserBundle/Resources/config/routing/security.xml" 

fos_user_profile: 
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml" 
    prefix: /profile 

#fos_user_register: 
# resource: "@FOSUserBundle/Resources/config/routing/registration.xml" 
# prefix: /register 

fos_user_resetting: 
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml" 
    prefix: /resetting 

fos_user_change_password: 
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml" 
    prefix: /profile 

Tutti gli indicatori molto apprezzate come ho bloccato con questo per un paio di giorni ora

risposta

7

Non so come stai gestendo il rilevamento/interruttore locale ma con JMSI18nRoutingBundle puoi fare come sotto.

aggiungere i fasci necessari per composer.json:

"require": { 
    ... 
    "jms/i18n-routing-bundle": "1.1.*", 
    "jms/translation-bundle": "1.1.*", 
    "friendsofsymfony/user-bundle": "1.3.*" 
}, 

Configurare i fasci:

jms_i18n_routing: 
    default_locale: en 
    locales: [en, fr, it, sp] 
    strategy: prefix 

Bootstrap i fasci:

$bundles = array(
    ... 
    new JMS\I18nRoutingBundle\JMSI18nRoutingBundle(), 
    new FOS\UserBundle\FOSUserBundle(), 
); 

Modifica percorsi esistenti per prefisso loro con il locale desiderato :

access_control: 
    # Routes are prefixed by ther user locale. 
    - { path: ^/[^/]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/[^/]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/[^/]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/[^/]+/admin, role: ROLE_ADMIN } 
    - { path: ^/[^/]+/, role: ROLE_USER } 

Ora dovrebbe funzionare!

+0

grazie per il suggerimento sul fascio JMS, cercherò questo approccio la prossima settimana quando tornerò in questo progetto. –

+0

Ho usato questa configurazione per configurare il mio sito multilingua. ma tutta la mia pagina di login è disponibile in tutte le lingue, dopo essere stata reindirizzata mi viene reindirizzato alla prima pagina senza alcuna localizzazione. Qualche idea? – ferdynator

10

La soluzione è stato quello di anteporre il locale alle rotte importazioni di FOSUserBundle:

# FOS User bundle 
fos_user_security: 
    resource: "@FOSUserBundle/Resources/config/routing/security.xml" 
    prefix: /{_locale} 

fos_user_profile: 
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml" 
    prefix: /{_locale}/profile 

fos_user_register: 
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml" 
    prefix: /{_locale}/register 

fos_user_resetting: 
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml" 
    prefix: /{_locale}/resetting 

fos_user_change_password: 
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml" 
    prefix: /{_locale}/profile 

e cambiarne anche il firewall per consentire locali nei percorsi anonimi e configurare il logout_path:

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       login_path: fos_user_security_login 
       check_path: fos_user_security_check 
      logout: 
       path: fos_user_security_logout 
      anonymous: true 

    access_control: 
     - { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY }   # allow wdt for debugging 
     - { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging 
     - { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY }  # allow assets to be loaded anonymously 

     - { path: ^/[a-z]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/[a-z]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/[a-z]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin, role: ROLE_ADMIN } 
     - { path: ^/, role: ROLE_USER } # this must be the last match, as url patterns are checked in the order they appear 

L'utilizzo del JMSI18nRoutingBundle sarebbe probabilmente migliore a lungo termine, ma non ha funzionato come soluzione di caduta quando l'ho provato e il budget per questo progetto non mi permetteva di iniziare a capire perché no, quindi sarà lasciato a un aggiornamento futuro.

2

La mia soluzione: È necessario ridefinire le route fos_user per il formato di tipo be_simple_i18n. (ho scelto la versione yaml):

in app/config/routing.yml

[...] 
#register the path to the file with the be_simple_i18n type fos_user routes 
fos_user:  
    resource: "config/routing/fos_user_i18n.yml" 
    type: be_simple_i18n 

my_yaml_i18n_routes: 
    resource: "config/routing/i18n.yml" 
    type: be_simple_i18n 

in app/Resources/config/routing/fos_user_i18n.yml:

#you have to make entries for all the fos_user routes here! 
#you can find them all in vendor/friendsofsymfony/user-bundle/Resources/routing 
fos_user_security_login: 
    locales: { en: "/login", de: "/anmelden" } 
    defaults: { _controller: FOSUserBundle:Security:login } 
fos_user_security_check: 
    locales: { en: "/login_check", de: "/login_pruefung" } 
    defaults: { _controller: FOSUserBundle:Security:check } 
#... 

In App /config/security.yml

firewalls:  
    [...] 

    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      login_path: fos_user_security_login 
      check_path: fos_user_security_check 
      csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4 

     logout: 
      path: fos_user_security_logout 
      target: #where_no_one_has_gone_before 
     [...] 

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/anmelden$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/registrieren, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    [...] 
0

Ho sofferto un po 'con questo problema.Volevo avere il login puro (senza URL nella sessione) per essere reindirizzato alla pagina localizzata corretta. sono riuscito a trovare la risposta nella documentazione di Symfony:

# app/config/security.yml 
security: 
# ... 
firewalls: 
    main: 
     form_login: 
      # ... 
      default_target_path: index [ or your named route ] 
+0

Ciao, grazie per la tua risposta, potresti pubblicare un link alla risorsa pertinente? –

Problemi correlati