2013-06-20 33 views
8

Tôi đang cố gắng chuyển miền địa phương sang làm việc trong màn hình đăng nhập của ứng dụng. Để thực hiện điều đó, tôi có các liên kết trên trang đăng nhập trỏ đến site.com/ (ngôn ngữ mặc định) và site.com/en (ngôn ngữ thứ hai mà tôi hỗ trợ). Ngay sau khi tôi đăng nhập, việc chuyển đổi hoạt động như một sự quyến rũ. Tuy nhiên, nếu tôi chưa xác thực thì thông tin đăng nhập luôn quay trở lại ngôn ngữ mặc định. Sự hiểu biết của tôi là nếu tôi sử dụng các tuyến đường được đặt tên từ FOSUserBundle thì nó sẽ có thể tự động xử lý các miền, nhưng tôi không thể làm cho nó hoạt động.Chuyển đổi miền địa phương trong đăng nhập của FOSUserBundle

Ứng dụng của tôi/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 } 

Ứng dụng của tôi/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 

Bất kỳ con trỏ nhiều đánh giá cao như tôi đã bị mắc kẹt với điều này cho một vài days now

Trả lời

7

Tôi không biết cách bạn xử lý phát hiện/chuyển đổi ngôn ngữ nhưng với JMSI18nRoutingBundle bạn có thể thực hiện như bên dưới.

Thêm bó cần thiết để composer.json:

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

Cấu hình các bó:

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

Bootstrap các bó:

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

Sửa tuyến đường hiện có để tiền tố họ với miền địa phương mong muốn :

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 } 

Bây giờ nó sẽ hoạt động!

+0

nhờ mẹo trên gói JMS, tôi sẽ thử phương pháp này vào tuần tới khi tôi quay lại dự án này. –

+0

Tôi đã sử dụng thiết lập này để định cấu hình trang web đa ngôn ngữ của mình. nhưng tất cả các trang đăng nhập của tôi khó khăn có sẵn trong tất cả các ngôn ngữ tôi được chuyển hướng đến trang đầu mà không có bất kỳ ngôn ngữ nào sau khi đăng nhập. Bất kỳ ý tưởng? – ferdynator

10

Các giải pháp rốt cuộc là tiền tố bản địa đối với hàng hoá đường 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 

Và cũng thay đổi các bức tường lửa để cho phép miền địa phương ở các tuyến đường mang tính chất và cấu hình 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 

Sử dụng JMSI18nRoutingBundle có lẽ sẽ tốt hơn trong dài hạn, nhưng nó không hoạt động như một giải pháp giảm khi tôi thử nó và ngân sách cho dự án này không cho phép tôi bắt đầu tìm ra lý do tại sao không, một bản cập nhật trong tương lai.

2

Giải pháp của tôi: Bạn phải xác định lại các tuyến fos_user cho định dạng loại be_simple_i18n. (tôi đã chọn phiên bản yaml):

Trong 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 

Trong ứng dụng/Resources/config/định tuyến/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 } 
#... 

Trong ứng dụng /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

Tôi đã gặp khó khăn một chút với vấn đề này.Tôi muốn đăng nhập thuần túy (không có URL trong phiên) để được chuyển hướng đến trang được bản địa hóa thích hợp. Tôi có thể tìm câu trả lời trong tài liệu của Symfony:

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

Xin chào, cảm ơn bạn đã trả lời, bạn có thể đăng liên kết tới tài nguyên liên quan không? –

Các vấn đề liên quan