2013-08-23 29 views
6

Tôi có một khu vực quản trị với thông tin đăng nhập mà chúng tôi đang buộc phải https: //. Nhấn vào tuyến đường/quản trị viên sẽ chuyển hướng đến trang đăng nhập nếu người dùng chưa đăng nhập nhưng tôi nhận được vòng lặp chuyển hướng vô tận. Không chắc chắn có gì sai, đây là security.yml:Vòng lặp chuyển hướng tử vong trong bảo mật Symfony2

firewalls: 
     admin_login: 
      pattern: ^/admin/secured/login$ 
      security: false 

     admin_secured_area: 
      pattern: ^/admin 
      provider: entity_admin 
      form_login: 
       check_path: /admin/secured/login_check 
       login_path: /admin/secured/login 
       default_target_path: /admin 
      logout: 
       path: /admin/secured/logout 
       target:/

    access_control: 
     - { path: ^/admin/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

Cảm ơn sự giúp đỡ của bạn!

+1

bạn đã thử xóa admin_login chưa? từ phần tường lửa của bạn? – ILikeTacos

+0

Xin chào theo tài liệu tôi cần admin_login để cho phép người dùng ẩn danh truy cập vào biểu mẫu đăng nhập. Tôi cũng đã thử xóa và nó vẫn chuyển hướng. Cảm ơn mặc dù! – Acyra

+0

Vui lòng cho biết giữa các trang chuyển hướng sẽ diễn ra như thế nào? –

Trả lời

3

Hi vì vậy đây có liên quan đến cách mà Symfony2 $request->isSecure() kiểm tra cho SSL khi trang web đang được một cân bằng tải, có một số cái tên tiêu đề không phù hợp trong PHP. Tệp cấu hình cần có các thông tin sau:

trusted_proxies: [10.0.0.0/8] 

Bây giờ nó hoạt động, nhưng tôi không biết có vấn đề bảo mật với cài đặt này hay không.

+1

Là một lưu ý phụ cho điều này, bạn cần đảm bảo rằng bạn đang chuyển tiếp tiêu đề chính xác từ proxy. Symfony kiểm tra xem liệu 'X_FORWARDED_PROTO' = 'https', 'on', 'ssl' hay '1'. Bạn có thể thấy biến này bằng var_dump $ _SERVER trong app.php hoặc app_dev.php – DIMMSum

+0

Xin chào Decave, bạn có thể xây dựng trên nhận xét của mình không? Mã nào chúng ta cần để đảm bảo tiêu đề chính xác từ proxy? Cảm ơn bạn! – Acyra

+1

Bạn cần định cấu hình proxy để nhận được yêu cầu qua https từ trình duyệt, nó chuyển tiếp biến '$ _SERVER' cho biết rằng nó đã nhận được yêu cầu qua https. Bạn có quen thuộc với cách thức hoạt động của proxy không? Nếu proxy nhận được yêu cầu qua https, đôi khi nó sẽ chuyển yêu cầu đó tới máy chủ web qua http. Do đó, máy chủ web không có cách nào để biết liệu yêu cầu gốc có phải là https hay không, vì vậy proxy phải chuyển tiếp biến '$ _SERVER' làm tham chiếu thay thế. Biến '$ _SERVER' mà Symfony kiểm tra là' X_FORWARDED_PROTO'. Điều đó có ý nghĩa? – DIMMSum

2

^/admin/secured/login_check cũng phải được xác thực nặc danh vì người dùng sẽ không có vai trò khi họ gọi trang đó ban đầu, do đó vòng lặp.

+0

Xin cảm ơn lời đề nghị. Tôi đã thử điều này và nó vẫn thất bại. Ngoài ra không có yêu cầu đối với người dùng ẩn danh trên login_check trong tài liệu, và đăng nhập hoạt động tốt khi không buộc https. Nhờ đề nghị mặc dù. Tôi sẽ tiếp tục làm việc này! – Acyra

4

Sau khi xem nhanh tôi sẽ nói rằng một cái gì đó như thế này dưới đây sẽ là đúng:

firewalls: 
    admin_secured_area: 
     pattern: ^/admin 
     provider: entity_admin 
     form_login: 
      check_path: /admin/secured/login_check 
      login_path: /admin/secured/login 
      default_target_path: /admin 
     logout: 
      path: /admin/secured/logout 
      target:/

access_control: 
    - { path: ^/admin/secured/(login|login_check|logout)$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
    - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

Dù sao, nếu điều này không giúp đỡ, tôi khuyên bạn nên kiểm tra chuyển hướng với built-in profiler (tab với trận tuyến đường và nhật ký), để bật tính năng này trên các chuyển hướng, thay đổi config_dev.yml thành:

web_profiler: 
    toolbar: true 
    intercept_redirects: true 
+0

Tiêu đề của tôi trong yêu cầu đã đặt HTTPS thành tắt ngay cả khi thực sự đang thực hiện https ... vấn đề nginx config không phải là symfony, intercept_redirects: true ... đã giúp tôi tìm thấy nó .. – Drmjo

6

Không cần phần "admin_login" trong tường lửa. Nhưng có vẻ như bạn quên thông số ẩn danh ..

firewalls:  
     admin_secured_area: 
      anonymous: ~ 
      pattern: ^/admin 
      provider: entity_admin 
      form_login: 
       check_path: /admin/secured/login_check 
       login_path: /admin/secured/login 
       default_target_path: /admin 
      logout: 
       path: /admin/secured/logout 
       target:/

    access_control: 
     - { path: ^/admin/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

Như tôi đã nói trong nhận xét của mình, bạn có đặt vai trò ROLE_ADMIN cho người dùng đã đăng nhập không?

CHỈNH SỬA: Kênh HTTPS trạng thái định tuyến của bạn có dành cho phần quản trị không?

+0

Xin cảm ơn một lần nữa vì sự giúp đỡ của bạn. Không cần phải đặt https trong định tuyến, vì chúng tôi đã đặt nó trong access_control. – Acyra

+2

Tôi đã có một vấn đề tương tự và, đối với tôi, đã làm việc thêm 'anonymous: ~' vào 'admin_secured_area'. –

2

Remove:

admin_login: 
      pattern: ^/admin/secured/login$ 
      security: false 
Các vấn đề liên quan