0

直到最近,我还有一个向公众开放的区域(/ 和 /whatever)和一个需要 ROLE_USER 的安全区域(/portal 和 /portal/whatever)。现在我想在我的安全区域内创建一个需要 ROLE_ADMIN 的管理区域。(/portal/admin 和 /portal/admin/whatever)。

我的 security.yml 如下所示:

    firewalls:
    login_firewall:
      pattern:    ^/portal/login$
      anonymous:  ~
    secured_area:
        pattern:    ^/portal
        form_login:
            login_path:  portal_login
            check_path:  login_check
            default_target_path: portal_dashboard  
        logout:
            path:   portal_logout
            target: portal_dashboard
        http_basic:
            realm: "MyFreelancer Client Portal"

    access_control:
    - { path: ^/portal/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/portal/, roles: ROLE_USER }
    - { path: ^/portal/admin, roles: ROLE_ADMIN }

我刚刚添加了第三行。我的问题是具有 ROLE_USER 的用户仍然可以访问 ^/portal/admin。有人可以向我解释为什么这不起作用吗?

另一种方法是在 /admin 和 /admin/whatever 下设置管理区域,但这需要完全不同的防火墙上下文,我不太确定该怎么做。我试过了,但它一直把我带回 /portal/,当我浏览到 /admin/ 时,它要求再次登录,然后又把我带回 /portal/(无限循环)。

如果作为辅助答案,您可以向我解释用户区域和管理区域的单个防火墙上下文与单独的防火墙上下文的优缺点以及如何实现(如有必要)?

先感谢您。

更新:我发现只需交换两条底线即可解决问题,因为它会按顺序运行它们,因此 /portal/admin/ 会针对第二条线运行,这只需要 ROLE_USER。如果有人仍然可以让我了解在单独的防火墙上下文中运行管理区域是否更好,为什么,如果是,如何?

4

1 回答 1

0

设置您的 access_control 时,请确保您的路线的顺序与上述路线之一不匹配。例如,将 ^/admin/login/ 放在 ^/admin/ 上方,否则将触发第一个匹配项(即 ^/admin/)。

于 2013-12-10T18:28:25.687 回答