【问题标题】:Symfony 2 - hide the whole website with a HTTP Authentication dialogSymfony 2 - 使用 HTTP 身份验证对话框隐藏整个网站
【发布时间】:2012-05-07 11:57:14
【问题描述】:

我正在使用 Symfony 2 构建网站。

工作正在进行中(因此我不希望用户或搜索引擎访问它)但我的客户希望看到我的进度。我在想一个简单的解决方案是使用 Symfony 2 安全功能提供的机制通过 HTTP 身份验证来保护整个网站。

我正在使用 FOSUserBundle,因为网站会有需要注册和登录的用户。

这是我的 security.yml,效果很好:

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

因此,我试图在其上添加其他内容,以允许网站受到 HTTP 身份验证的保护。
我将文件更改为:

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

基本上我添加了whole_website_provider 提供程序、whole_website 防火墙和一个额外的access_control
但这不起作用:当我访问该网站时,我被重定向到登录表单,就是这样。

你知道我是否能做到以及如何做到吗?

注意:我不希望为此使用任何 Apache 功能。

【问题讨论】:

  • 如果你把whole_website防火墙放在第一位会发生什么?不要忘记清除缓存。
  • @gilden:至少显示了身份验证框,但我找不到正确身份验证的方法。
  • 很抱歉我没有时间给出适当的建议,但我猜你还需要为whole_website 明确设置用户提供程序,否则 Sf2 将使用第一个。我猜 PéCé 的建议也适用,但有点强迫症,我会采用困难但更优雅的解决方案:)

标签: security symfony firewall


【解决方案1】:

在我看来,您需要的不是使用 HTTP 身份验证来管理用户,而是使用 HTTP 身份验证来限制对您网站的访问。不要为此使用 Symfony2 安全性。

让您的 symfony2 应用程序安全,因为它将处于生产模式,并使用 apache .htaccess 来限制对站点的访问。

文档在这里http://httpd.apache.org/docs/2.2/howto/auth.html。您只需在 web/.htaccess 中添加一些指令,并按照文档中的说明创建用户/密码文件...

【讨论】:

  • 谢谢佩斯。我仍然更愿意在应用程序级别完成所有工作,而不是求助于 Apache。
  • 我决定采纳你的建议,因为我的方式似乎并不容易,毕竟按照其他开发人员的期望来实现是件好事。
  • 如果您只需要在不识别用户的情况下确保访问安全,我认为这种方式很好。此外,一旦他们通过了这个临时安全措施,他们就会看到未来的应用程序,使用相同的登录过程。
【解决方案2】:

我在 Symfony2 中的解决方案,使用 symfony 的基本防火墙(没有 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]

它非常适合我。这是一个非常基本的配置——没有散列密码,没有数据库提供者(“提供者:”部分),没有 https 连接(互联网上的一切都是纯文本),没有注销的东西和其他不错的功能。 我希望它会帮助你。 亲切的问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2012-04-25
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多