我想我并不完全理解symfony的防火墙和访问控制的概念,但这是我的理解。
我已正确安装并配置了FOSUserBundle。
我创建了一些角色:
role_hierarchy:
ROLE_COACH: [ROLE_USER]
ROLE_EDITOR: [ROLE_USER]
ROLE_PREMIUM_COACH : [ROLE_USER, ROLE_COACH]
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_COACH, ROLE_EDITOR, ROLE_PREMIUM_COACH]
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
如果他们没有登录,我想阻止他们访问网址/信息中心,因此如果他们没有角色ROLE_USER。
这是我的防火墙:
firewalls:
# -> custom firewall for the admin area of the URL
admin:
pattern: /admin(.*)
form_login:
provider: fos_userbundle
login_path: /admin/login
use_forward: false
check_path: /admin/login_check
failure_path: null
logout:
path: /admin/logout
anonymous: true
# -> end custom configuration
# defaut login area for standard users
main:
pattern: .*
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: /login
use_forward: false
check_path: /login_check
failure_path: null
logout: true
anonymous: true
这是我在access_control下添加的内容:
- { path: ^/dashboard, role: [ROLE_USER]}
- { path: ^/dashboard/blog, role: [ROLE_EDITOR]}
即使我没有连接也可以访问页面/仪表板,我不希望这样。我错了什么?
答案 0 :(得分:2)
- { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
此行是导致您的问题的原因。这告诉symfony2安全系统每个用户都可以访问所有内容(如果忽略FOS,这是“第一条规则”),因此,当满足时,不会进行任何其他控制(因为- { path: ^/OSC/dashboard, role: ROLE_USER}
来了后)
Possibile解决方案:
1)将该行放在acl的底部。
PRO :您的应用程序将正常工作 缺点:如果您没有正确设置所有ACL,您将遇到“安全”问题,或者某些未经授权的用户可能会访问您的逻辑中无法访问的页面。
2)删除该行
PRO :您的应用程序不会受到安全问题和未经授权的访问的影响 缺点:您必须明确且正确地设置所有路线,但如果您想构建一个强大的应用程序,这非常“自然”
答案 1 :(得分:-1)
您接通的原因是因为/dashboard
没有防火墙,但是(假设您正尝试设置SonataAdminBundle
)这不是您应该拥有的防火墙access_control
以下是我如何查找Sonata
:
access_control:
- { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/login-check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_ADMIN }
- { path: ^/.*, role: [IS_AUTHENTICATED_ANONYMOUSLY] }
否则你的防火墙定义很好。
如果您尝试配置自己的自定义仪表板,则需要定义另一个防火墙条目,与admin
防火墙非常相似。
修改强>:
尝试将模式更改为:^/.*
如果您想仅阻止/OSC
:/OSC(.*)