首页 文章

Symfony角色和安全性解释

提问于
浏览
1

我正在尝试学习Symfony角色和安全性 . 我当前的 security.yml 文件,如下所示:

role_hierarchy: 
    ROLE_USER: ROLE_DO_ALMOST_NOTHING
    ROLE_EDITOR: [ ROLE_USER, ROLE_ALLOWED_TO_EDIT ]
    ROLE_CONTRIBUTOR: [ ROLE_EDITOR, ROLE_ALLOWED_TO_CONTRIBUTE ]
    ROLE_ADMIN: [ ROLE_CONTRIBUTOR ]
    ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_DO_ANY_THING ]

access_control: 
    - { path: ^/admin, roles: ROLE_USER }
    - { path: ^/admin/editor, roles: ROLE_ADMIN }
    - { path: ^/editor, roles: ROLE_EDITOR }
    - { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
    - { path: ^/super, roles: ROLE_SUPER_ADMIN }

我正在为我的用户使用此设置:

providers:
    in_memory:
        memory: 
            users:
                person:
                    password: password!
                    roles: 'ROLE_USER'
                admin: 
                    password: password2
                    roles: 'ROLE_ADMIN'

这是我的问题 . 我一直在寻找安全性的access_control部分,但是,标记为 ROLE_ADMIN 的角色的路径 ^/admin/editor 将允许用户访问路由,即使person用户没有 ROLE_ADMIN 的角色 . 我想知道这是否是因为路由本身是由与 ^admin 路由相同的控制器共享的?或者有人看到我可能在代码中出错的地方,因为用户可以访问我不应该访问的路径 .

其他路线:

- { path: ^/editor, roles: ROLE_EDITOR }
- { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
- { path: ^/super, roles: ROLE_SUPER_ADMIN }

按预期工作 .

1 回答

  • 2

    问题是您在匹配 admin/editor 之前匹配 /admin ,并且只需要 ROLE_USER 角色 . 当你有:

    - { path: ^/admin, roles: ROLE_USER }
    

    这匹配以 /admin 开头的所有内容,包括 admin/editor . 一旦Symfony找到合适的路线,它就不会检查它们中的第一个 . 所以从未达到 ^/admin/editor/ 检查 . 试试这个:

    access_control: 
        - { path: ^/admin/editor, roles: ROLE_ADMIN }
        - { path: ^/admin, roles: ROLE_USER }
        - { path: ^/editor, roles: ROLE_EDITOR }
        - { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
        - { path: ^/super, roles: ROLE_SUPER_ADMIN }
    

    作为一个好的经验法则,您应该首先放置最细粒度/特定的路线 . 任何子路线应始终位于主路线之前 .

相关问题