2012-05-07 28 views
5

Tôi đang sử dụng Symfony 2 để xây dựng trang web.Symfony 2 - ẩn toàn bộ trang web bằng hộp thoại Xác thực HTTP

Công việc đang diễn ra (do đó tôi không muốn người dùng hoặc công cụ tìm kiếm truy cập vào nó) nhưng khách hàng của tôi muốn thấy tiến trình của tôi. Tôi đã nghĩ một giải pháp dễ dàng là bảo vệ toàn bộ trang web bằng xác thực HTTP bằng cách sử dụng cơ chế được cung cấp bởi chức năng bảo mật của Symfony 2.

Tôi đang sử dụng FOSUserBundle vì trang web sẽ có người dùng cần đăng ký và đăng nhập.

Đây là security.yml của tôi, mà các công trình lớn:

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_manager 

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

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true  

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

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

Vì vậy, tôi đã cố gắng để thêm một cái gì đó khác trên đầu trang của nó, để cho phép các trang web để được bảo vệ bởi HTTP Authentication.
Tôi đã thay đổi tập tin để:

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_manager 
     whole_website_provider: 
      users: 
       ryan: { password: ryanpass, roles: 'ROLE_USER' }   

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

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true 
     whole_website: 
      pattern: ^/ 
      anonymous: ~ 
      http_basic: 
       realm: "Secured Demo Area"  

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

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

Về cơ bản tôi đã thêm các nhà cung cấp whole_website_provider, các whole_website tường lửa và thêm một access_control.
Nhưng điều đó không hiệu quả: khi tôi truy cập trang web, tôi được chuyển hướng đến biểu mẫu đăng nhập, đó là nó.

Bạn có bất kỳ ý tưởng nào cho dù tôi có thể làm điều đó hay không?

N.B .: Tôi không muốn sử dụng bất kỳ tính năng Apache nào cho nó.

+1

Điều gì sẽ xảy ra nếu bạn đặt tường lửa 'toàn bộ trang web 'trước? Đừng quên xóa bộ nhớ cache. – gilden

+0

@gilden: hiển thị hộp xác thực, ít nhất nhưng tôi không thể tìm cách xác thực chính xác. – dan

+0

Tôi xin lỗi tôi không có thời gian để đưa ra lời khuyên thích hợp, nhưng tôi đoán bạn cũng cần phải đặt rõ ràng nhà cung cấp người dùng cho 'toàn bộ trang web' hoặc Sf2 sẽ sử dụng giá trị đầu tiên. Những gì PéCé đang đề xuất hoạt động là tốt, tôi đoán, nhưng được phần nào ocd, tôi sẽ đưa vào các giải pháp khó khăn, nhưng thanh lịch hơn :) – gilden

Trả lời

4

Theo ý kiến ​​của tôi, những gì bạn cần không phải là quản lý người dùng có xác thực HTTP nhưng hạn chế quyền truy cập vào trang web của bạn bằng xác thực HTTP. Không sử dụng bảo mật Symfony2 cho điều đó.

Để bảo mật ứng dụng symfony2 của bạn vì nó sẽ ở chế độ sản xuất và sử dụng apache .htaccess để hạn chế quyền truy cập vào trang web.

Tài liệu ở đây http://httpd.apache.org/docs/2.2/howto/auth.html. Bạn chỉ cần có thêm một số chỉ thị trong web/.htaccess, và tạo ra một tập tin người dùng/mật khẩu như đã giải thích trong doc ...

+1

Cảm ơn Pece. Tôi vẫn muốn có mọi thứ được thực hiện trên cấp độ ứng dụng, hơn là nghỉ mát với Apache. – dan

+0

Tôi đã quyết định đi cho đề xuất của bạn bởi vì nó dường như không dễ dàng theo cách của tôi và, sau khi tất cả, nó là tốt để thực hiện những thứ như một nhà phát triển mong đợi. – dan

+0

Tôi nghĩ cách này rất tốt nếu bạn chỉ cần bảo mật quyền truy cập mà không cần xác định người dùng.Hơn nữa, một khi họ vượt qua an ninh tạm thời này, họ thấy ứng dụng tương lai như nó sẽ có, với cùng một quá trình đăng nhập. – AlterPHP

0

giải pháp của tôi trong Symfony2, sử dụng tường lửa cơ bản của symfony (không FOSUserBundle):

# app/config/security.yml 
security: 

    firewalls: 
     secured_area: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: login 
       check_path: login_check 

    access_control: 
     - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin, roles: ROLE_ADMIN } 
     - { path: ^/, roles: ROLE_USER } 

    providers: 
     in_memory: 
      memory: 
       users: 
        redattore: { password: 'somePasswordHere', roles: 'ROLE_USER' } 
        admin: { password: 'somePasswordHere', roles: 'ROLE_ADMIN' } 

    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

Nó hoạt động hoàn hảo cho tôi. Đó là một cấu hình rất cơ bản - không có mật khẩu băm, không có nhà cung cấp cơ sở dữ liệu ("nhà cung cấp:"), không có kết nối https (mọi thứ diễn ra trong văn bản thuần túy trên internet), mà không cần đăng xuất và các tính năng đẹp khác. Tôi hy vọng nó sẽ giúp bạn. Với loại liên quan

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