使用用户实体进行身份验证时如何在Symfony 4中使用独立的基本身份验证

问题描述 投票:1回答:1

我正在尝试使用Symfony 4(nginx)为登台环境添加基本身份验证。不幸的是,它不能很好地工作。如果您在防火墙设置(security.yaml)中定义了基本身份验证,它将自动使用防火墙中指定的提供程序。结果,Symfony使用基本身份验证作为实际登录名。集成简单的基本身份验证应该不那么困难吗?我会误会吗?

我的目标:

  • 两个独立的认证(用户之间没有关联)
  • 如果我通过基本身份验证登录,那么我应该能够通过实际的登录页面与用户实体一起登录。该页面的行为应与未登录且不使用基本身份验证的行为相同。

我试图整合几个防火墙...

staging/security.yaml

security:
    providers:
        our_users:
            entity: { class: App\Entity\User\User, property: email }

        basic_auth:
            memory:
                users:
                    system: { password: 'testpw', roles: ['ROLE_BASIC_AUTH'] }

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        staging:
            provider: basic_auth
            http_basic:
                realm: "My Basic Auth"

        main:
            anonymous: ~

            form_login:
                provider: our_users
                login_path: my_login_path
                csrf_token_generator: security.csrf.token_manager
                default_target_path: homepage

            guard:
                provider: our_users
                authenticators:
                    - App\Security\LoginFormAuthenticator

    access_control:
        - { path: ^/admin, role: ROLE_ADMIN }
        - { path: ^/login$, role: ROLE_BASIC_AUTH }
        - { path: ^/$, role: IS_AUTHENTICATED_REMEMBERED }

我可以使用它通过基本身份验证来验证自己的身份,但是我处于登台防火墙中。现在尝试登录时,它总是失败。我认为发生这种情况是因为此防火墙中的表单未分配给引用该用户实体的身份验证器。而且它不会自动将防火墙切换到正确的防火墙。

basic auth login

如果您在页面上使用用户系统,实现基本身份验证的最佳实践是什么?

感谢您的推荐!

编辑:

[如果有人遇到相同的问题:我发现了这个问题。请看一下已接受答案的答复。感谢您的帮助!

php symfony authentication basic-authentication
1个回答
2
投票

URL只能由一个防火墙保护,将使用第一个匹配的防火墙,这就是为什么会出现冲突。

[使用安全组件时,防火墙将根据请求匹配器的结果来决定是否处理请求:匹配请求的第一个防火墙将处理它。

https://symfony.com/doc/current/security/firewall_restriction.html

最简单的解决方案可能是在Web服务器上配置基本身份验证,例如Apachenginx的示例。

© www.soinside.com 2019 - 2024. All rights reserved.