【发布时间】:2026-01-05 21:05:02
【问题描述】:
我尝试在 Symfony 的 src/ 下为每个文件夹设置安全性。但我希望每个主文件夹“General”和“Intranet”有一组不同的安全规则不必为路由添加前缀...所以我只需要添加“Extranet”前缀
这可能吗?我知道在 routing.yml 中有前缀很容易做到,但这不是一个选择,因为可见的 url 会突然改变
当我们必须允许外部用户访问我们的平台时,问题就出现了。多年来,它仅供公司员工使用,但现在外部人员必须有权访问某些页面。并且一些通用路由(ajax 调用等)必须可供所有人使用
- 源/
- Intranet/ => 为内部用户打开路由
- 一些捆绑
- ...
- General/ => 为所有用户开放路线
- 另一个捆绑包
- ...
- Extranet/ => 为外部用户打开路由
- TheBestBundle
- ...
- Intranet/ => 为内部用户打开路由
那么Extranet 路由都会得到一个额外的前缀/extranet/。但我希望其他 2 个(通用和 Intranet)没有任何前缀
# routing.yml
extranet:
resource: "@ExtranetBundle/Controller/"
prefix: /extranet/
然后通过访问控制,我负责 /extranet 路由
access_control:
# Login and the base_route "/" is always available
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
# External users + Super admins + server IP's can only access urls starting with /extranet/
-
path: ^/extranet/*
roles: [ROLE_EXTERNAL_USER, ROLE_SUPER_ADMIN]
ips: !php/const:SomeBundle\SomeClass\ConstantProvider::ALLOWED_SERVER_IPS
# Some routes need to be available for both internal and external users
# but hopefully without having to prefix them
...
# All other routes are only for internal users and the right ip addresses
-
path: ^/*
role: ROLE_INTERNAL_USER
ips: !php/const:SomeBundle\SomeClass\ConstantProvider::ALLOWED_SERVER_IPS
或者也许是一个以不同的方式解决这个问题的想法?
【问题讨论】:
-
您可以在通用文件夹中为所有内部控制器添加一个接口,然后编写一个订阅者来检查请求并在当前控制器实现该接口时阻止所有外部用户。
标签: symfony security routing bundle