【问题标题】:Setting up security for each src folder in Symfony为 Symfony 中的每个 src 文件夹设置安全性
【发布时间】:2026-01-05 21:05:02
【问题描述】:

我尝试在 Symfony 的 src/ 下为每个文件夹设置安全性。但我希望每个主文件夹“General”和“Intranet”有一组不同的安全规则不必为路由添加前缀...所以我只需要添加“Extranet”前缀

这可能吗?我知道在 routing.yml 中有前缀很容易做到,但这不是一个选择,因为可见的 url 会突然改变

当我们必须允许外部用户访问我们的平台时,问题就出现了。多年来,它仅供公司员工使用,但现在外部人员必须有权访问某些页面。并且一些通用路由(ajax 调用等)必须可供所有人使用

  • 源/
    • Intranet/ => 为内部用户打开路由
      • 一些捆绑
      • ...
    • General/ => 为所有用户开放路线
      • 另一个捆绑包
      • ...
    • Extranet/ => 为外部用户打开路由
      • TheBestBundle
      • ...

那么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


【解决方案1】:

我认为最好的方法是使用 voter 外部用户需要有一个唯一的角色 (EXTERNAL_ROLE) 然后你可以使用 voter 来拒绝你想要保护的资源https://symfony.com/doc/current/security/voters.html 这样你就可以保护一个基于逻辑不在文件夹中

【讨论】:

    最近更新 更多