2012-09-06 28 views
5

Chúng tôi có một hệ thống nơi quản trị viên và người dùng chuẩn được xử lý bởi nhà cung cấp bảo mật riêng của họ. Điều này đã gây ra sự cố trong các trang quản trị vì quản trị viên không thể truy cập bất kỳ tệp hoặc hình ảnh nào nằm phía sau tường lửa của trang web chính trừ khi chúng cũng được đăng nhập vào trang web chính.Symfony 2: Truy cập tuyến đường có tường lửa với hai nhà cung cấp riêng biệt

Hình ảnh và tệp cần phải có thể truy cập được đối với tất cả người dùng và quản trị viên được xác thực, bất kể nhà cung cấp. Chúng được phục vụ thông qua bộ điều khiển cung cấp khả năng kiểm soát truy cập chi tiết hơn.

Có thể xác định nhiều nhà cung cấp để cho phép truy cập vào tuyến đường không?

Dưới đây là một phiên bản rút gọn security.yml hiện tại của chúng tôi:

security: 
    providers: 
     admin_user_db: 
      entity: { class: OurAdminUserBundle:AdminUser, property: username } 
     site_user_db: 
      entity: { class: OurSiteUserBundle:SiteUser, property: username } 
    firewalls: 
     admin_login: 
      pattern: ^/admin/login$ 
      security: false 
     site_user_login: 
      pattern: ^/login 
      security: false 
     file_route: 
      pattern: ^/file 
      anonymous: ~ 
      ### We need to allow this route only for authorized users from 
      ### either admin_user_db or site_user_db providers 
     admin_secured_area: 
      pattern: ^/admin 
      http_basic: ~ 
      provider: admin_user_db 
      form_login: 
       check_path: /admin/login_check 
       login_path: /admin/login 
      logout: 
       path: /admin/logout 
       target:/
     site_secured_area: 
      pattern: .* 
      http_basic: ~ 
      provider: site_user_db 
      form_login: 
       check_path: /check_login 
       login_path: /login 
       failure_path: /login 
       failure_forward: false 
      logout: 
       path: /logout 
       target:/

Trả lời

5

Tôi đoán những gì bạn đang tìm kiếm là ChainProvider. Nhà cung cấp này sẽ được định cấu hình để sử dụng hai nhà cung cấp hiện tại của bạn theo cách tuần tự.

Nhà cung cấp chuỗi trước tiên sẽ cố gắng xác thực người dùng với nhà cung cấp đầu tiên được cấu hình. Nếu đó là một thành công, người dùng được xác thực. Nếu đó là một thất bại, các nhà cung cấp chuỗi sẽ cố gắng tiếp theo và như vậy cho đến khi không có nhiều nhà cung cấp có thể được thử.

Tôi đã sử dụng kỹ thuật này để cho phép người dùng xác thực bằng đăng nhập biểu mẫu hoặc đăng nhập bằng facebook. Tôi có hai nhà cung cấp, một cho facebook, một cho hình thức. Sau đó, trong tường lửa của tôi, nhà cung cấp là nhà cung cấp chuỗi và sau đó, người dùng có thể đăng nhập bằng thông tin đăng nhập của họ hoặc bằng tài khoản facebook của họ.

Vì nhà cung cấp chuỗi là tuần tự, điều tôi đề nghị là đặt nhà cung cấp có thể sẽ được sử dụng thường xuyên nhất trước tiên.

Dưới đây là một mẫu cấu hình lấy từ trang web tài liệu Symfony:

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, user_db] 
     in_memory: 
      users: 
       foo: { password: test } 
     user_db: 
      entity: { class: Acme\UserBundle\Entity\User, property: username 

Bạn có thể có một cái nhìn tại documenation đây:

  1. Using Multiple User Providers

Kính trọng, Matt

+0

Cảm ơn bạn đã trả lời, chúng tôi có thể thiết lập 'ChainProvider' với các hướng dẫn này (mặc dù tôi nghĩ rằng cú pháp có một chút khác biệt trong phiên bản Symfony của chúng tôi). Cuối cùng chúng tôi đã kết thúc việc bỏ qua 'AdminUser' và sử dụng các vai trò thay vì @jperovic gợi ý, vì chúng tôi nhận ra rằng các nhà cung cấp riêng biệt không thực sự cần thiết trong kịch bản của chúng tôi. – Kaivosukeltaja

1

Tôi đã có một số kinh nghiệm với vấn đề này và giải pháp là một trong đó Matt đã viết.

Tuy nhiên, vì ứng dụng đã có tường lửa Quản trị, Học sinh và Giáo viên, tôi không thể đạt được mạo danh thành công khi cần. Tức là, người dùng từ Quản trị có thể mạo danh người dùng khỏi tường lửa của họ và chỉ những người dùng đó. Bây giờ, có thể tôi đã làm điều gì đó sai nhưng vì đây là nhiệm vụ nhạy cảm về thời gian, chúng tôi quyết định đặt mọi thứ vào tường lửa đơn và để các vai trò khác nhau thực hiện công việc. Điều này hóa ra là giải pháp đơn giản hơn nhiều nhưng cuối cùng là tùy thuộc vào bạn ...

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