使用用户实体进行身份验证时如何在 Symfony 4 中使用独立的基本身份验证
How to use an independent basic authentication in Symfony 4 when using a user entity for authentication
我正在尝试使用 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 对自己进行身份验证,但我在暂存防火墙中。当我现在尝试登录时,它总是失败。我认为发生这种情况是因为此防火墙中的表单未分配给引用用户实体的身份验证器。而且它不会自动将防火墙切换到正确的防火墙。
如果您在页面上使用用户系统,实施基本身份验证的最佳做法是什么?
感谢您的推荐!
编辑:
如果有人 运行 遇到同样的问题:我在我的案例中发现了问题。请查看已接受答案的回复。感谢您的帮助!
A URL 只能受一个防火墙保护,将使用第一个匹配的防火墙,这就是您遇到冲突的原因。
When using the Security component, firewalls will decide whether they handle a request based on the result of a request matcher: the first firewall matching the request will handle it.
https://symfony.com/doc/current/security/firewall_restriction.html
我正在尝试使用 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 对自己进行身份验证,但我在暂存防火墙中。当我现在尝试登录时,它总是失败。我认为发生这种情况是因为此防火墙中的表单未分配给引用用户实体的身份验证器。而且它不会自动将防火墙切换到正确的防火墙。
如果您在页面上使用用户系统,实施基本身份验证的最佳做法是什么?
感谢您的推荐!
编辑:
如果有人 运行 遇到同样的问题:我在我的案例中发现了问题。请查看已接受答案的回复。感谢您的帮助!
A URL 只能受一个防火墙保护,将使用第一个匹配的防火墙,这就是您遇到冲突的原因。
When using the Security component, firewalls will decide whether they handle a request based on the result of a request matcher: the first firewall matching the request will handle it.
https://symfony.com/doc/current/security/firewall_restriction.html