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

时间:2016-03-09 11:37:08

标签: symfony security http-authentication symfony-2.8

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

目前,当我点击以下主播时,我会获得标准浏览器HTTP身份验证弹出窗口。但是,如果我点击“取消”,我会转到空白/secret/landing

如何修改安全/防火墙配置以简单地关闭模式并保持在同一页面上?

<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 }

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以在.htaccess级别处理它:

RewriteEngine On
RewriteBase /

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

您需要启用mod_rewrite

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

答案 1 :(得分:-1)

我发现可以通过将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

希望这有助于某人。