在 Symfony 2 应用程序中优雅地处理中止的 HTTP 身份验证浏览器登录尝试

Gracefully handle an aborted HTTP authentication browser login attempt in Symfony 2 application

我想在我的 SF2 应用程序中优雅地处理中止的 HTTP 登录尝试。

目前,当我单击以下锚点时,会弹出标准浏览器 HTTP 身份验证。但是,如果我单击 'cancel',我会进入空白 /secret/landing

如何修改我的 security/firewall 配置以简单地关闭模式并保持在同一页面上?

<a href="/secret/landing/">Sign In</a>

我的 security.yml 看起来像这样:

security:
    providers:
        in_memory:
            memory:
                users:
                    crmpiccosecret:
                        password: rfc1872
                        roles: 'ROLE_SECRET'
    firewalls:
        secret:
            pattern: ^/secret/$
            anonymous: true
        secret_secured:
            pattern: ^/secret/.*$
            http_basic: ~
            provider: in_memory
            context: secret
    access_control:
        - { path: ^/secret, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/secret/.*, roles: ROLE_SECRET }

您可以在.htaccess级别处理:

RewriteEngine On
RewriteBase /

#if authorization header is empty (non-authenticated client)
RewriteCond %{HTTP:Authorization} !=""
RewriteRule ^$ /your/landing-page [L]

您需要启用 mod_rewrite

但我强烈建议将您的身份验证系统更改为简单的登录表单 - 它会给您更多的控制权。

我发现可以通过将 href 更改为 data-href 或任意值来实现所需的行为:

<a data-href="/secret/landing/" class="btn btn--primary inline--block sign-in-button no--margin-b">Sign In</a>

然后通过 AJAX 提出请求。因此,如果它中止,那么我们将停留在同一页面上,但如果它成功,那么您将通过 JavaScript 重定向转到该页面。

这个例子是在 CoffeeScript 中,因为这是我正在使用的,但代码非常少,可以根据需要转换为 JavaScript/jQuery:

  secretSignInButtonClickHandler: (e) =>
    e.preventDefault()

    href = $(e.currentTarget).attr('data-href')

    $.ajax
      url: href
      success: (response) =>
        document.location = href

希望这对某人有所帮助。