我正在建立一个网站,我想为前端和后端使用单独的防火墙和身份验证系统。所以我security.yml的配置如下。我在早期开发阶段使用 in_memory 用户提供程序。
security:
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]
providers:
backend_in_memory:
memory:
users:
admin: { password: admin, roles: [ 'ROLE_ADMIN' ] }
frontend_in_memory:
memory:
users:
user: { password: 12345, roles: [ 'ROLE_USER' ] }
firewalls:
# (Configuration for backend omitted)
frontend_login_page:
pattern: ^/login$
security: false
frontend:
pattern: ^/
provider: frontend_in_memory
anonymous: ~
form_login:
check_path: login_check_route # http://example.com/login_check
login_path: login_route # http://example.com/login
access_control:
# (Configuration for backend omitted)
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_USER }
我省略了后端部分,因为它无关紧要。当省略的部分被注释掉时,问题仍然存在。
问题是前端身份验证不适用于上述配置。这是我所做的:
- 访问http://example.com/login
- 输入凭证(user:12345),点击登录
- http://example.com/login_check对用户进行身份验证
- 身份验证服务将用户重定向回http://example.com/。没有错误被抛出。事实上,当我打开 debug_redirects 选项时,它清楚地表明“用户”在重定向页面上通过了身份验证。
预期行为:安全令牌应显示我在重定向后以“用户”身份登录并返回索引页面。
实际行为:安全令牌在重定向后仍然显示“匿名”登录并返回索引页面。
但是使用几乎相同的设置(路径和路由名称不同),后端部分可以正常工作。
经过一番调查,我发现原因是用户提供程序当前的编写方式。请注意,frontend_in_memory部分位于用于后端身份验证的backend_in_memory下方。所以我为前端防火墙明确指定了frontend_in_memory提供程序。它的工作原理 - 我必须在前端登录页面中使用“用户:12345”登录。使用“admin”登录将不起作用。所以它必须使用正确的用户提供程序。但我怀疑框架无法正确更新安全令牌,因为它仍在从第一个用户提供程序(即backend_in_memory )搜索“用户”帐户。事实上,我可以通过以下任一更改使上述配置工作:
- 将“用户”登录添加到backend_in_memory提供者的用户列表(密码不必相同),或
- 将frontend_in_memory与backend_in_memory交换,以便frontend_in_memory成为第一个用户提供者。
当然,它们不是解决这个问题的正确方法。将“用户”帐户添加到后端根本没有意义;交换两个用户提供者的顺序修复了前端但破坏了后端。
我想知道出了什么问题以及如何解决这个问题。谢谢!