我遇到了一个奇怪的问题。我有以下security.yml:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
ROLE_USER:
ROLE_EDITOR: [ROLE_USER]
ROLE_ADMIN: [ROLE_USER, ROLE_EDITOR]
providers:
in_memory:
memory:
users:
admin: { password: 123456, roles: [ 'ROLE_ADMIN' ] }
editor: { password: 123456, roles: [ 'ROLE_EDITOR' ] }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
backend:
pattern: ^/backend
anonymous: ~
provider: in_memory
form_login:
login_path: backend_login
check_path: backend_login_check
access_control:
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY, host: example\.com$ }
- { path: ^/backend_login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/backend, roles: ROLE_ADMIN }
- { path: ^/user/fetch, roles: ROLE_USER }
- { path: ^/level, roles: ROLE_USER }
- { path: ^/gallery, roles: ROLE_USER }
我有一台运行XAMPP的窗口开发机器,一切正常。我可以登录到后端,如果我没有登录并尝试打开后端路由,我会被重定向到登录页面。
这是我的路由部分:
backend_login:
pattern: /backend_login
defaults: { _controller: FooBackendBundle:Security:login }
backend_login_check:
pattern: /backend/login_check
但是当我将它上传到我的集成linux服务器时,我可以打开后端而无需登录。看起来Symfony并不关心当前用户的角色。
代码和symfony版本完全相同(Symfony 2.3)。
如果我从后端防火墙中删除anonymous: ~
部分,它将重定向到登录页面,但也会创建一个inifite重定向循环。
有人知道如何解决这个问题吗?
答案 0 :(得分:1)
对于每个传入请求,Symfony会检查每个access_control条目以查找与当前请求匹配的条目。一旦找到匹配的access_control条目,它就会停止 - 只有第一个匹配的access_control用于强制访问。
在安全配置中设置<span
class="input-label-caption"
*ngIf="!inputControl.validators.required"
>
(optional)
</span>
时,您希望将限制最少的匹配放在最后。在您的情况下,您将始终匹配第一个模式,因为所有路由在access_control
上匹配,因此不需要任何身份验证。将您的^/
更改为此:
access_control
我删除了access_control:
- { path: ^/backend_login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/backend, roles: ROLE_ADMIN }
- { path: ^/user/fetch, roles: ROLE_USER }
- { path: ^/level, roles: ROLE_USER }
- { path: ^/gallery, roles: ROLE_USER }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
参数,因为它看起来并不相关。