【问题标题】:Debugging Symfony 3.4 live - 403 page, possible User Roles issue调试 Symfony 3.4 live - 403 页面,可能的用户角色问题
【发布时间】:2021-10-08 13:33:06
【问题描述】:

当我使用用户角色登录时单击指向 /admin/stats 页面的链接时收到 403 错误:ROLE_EXPL 应该有权访问该页面。它适用于也可以访问此页面的 ROLE_ADMIN。

查看代码,有三个用户角色,并且指向相关页面的链接 /admin/stats 没有显示在用户角色 ROLE_PASS 的菜单上,而是显示在其他用户角色的菜单上。但是,此链接为 ROLE_EXPL 提供了 403 错误,但对 ROLE_ADMIN 工作正常

谁能建议从哪里开始调试?

代码: 安全.yaml

security:

    encoders:
        AppBundle\Entity\Pass:
            algorithm: bcrypt

    providers:
        pass_provider:
            entity:
                class: AppBundle:Pass
                property: username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~
            provider: pass_provider
            switch_user: true
            form_login:
                login_path: login
                check_path: login
                default_target_path: /home
                always_use_default_target_path: true
            logout:
                path:   /logout
                target: /login
            logout_on_user_change: true
            remember_me:
                secret:   '%kernel.secret%'
                lifetime: 604800 # 1 week in seconds
                path:     /home

    role_hierarchy:
        ROLE_PASS:           ROLE_USER
        ROLE_EXPL:           ROLE_USER
        ROLE_ADMIN:          ROLE_USER

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: '%https%' }
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%https%' }
        - { path: ^/forgotten_password, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%https%' }
        - { path: ^/reset_password, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%https%' }
       

要求的结果:

ROLE_EXPL 应该有权访问页面/admin/stats

【问题讨论】:

  • 你想达到什么目的? 403 表示“禁止”,如果这可以使用具有适当角色的另一个用户,一切听起来都很好?
  • 不应禁止该用户的链接。链接显示在该用户的管理面板中,但为什么它被禁止?我该如何改变呢?

标签: php symfony http-status-code-403 user-roles


【解决方案1】:

如果任何具有ROLE_EXPL 角色的用户应该有权访问/admin/stats,您需要更改access_control 设置。目前它说:

        - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: '%https%' }

...这意味着:只有角色ROLE_ADMIN 的用户才能访问以/admin 开头的路径

【讨论】:

  • 是的,开发人员似乎错过了路径 /admin/stats 的另一行;所以你认为我应该在上面或下面添加这一行吗? { path: ^/admin/stats, roles: ROLE_EXPL, requires_channel: '%https%' } 任何机会你都可以通过修改 anwser 来澄清这一点,谢谢 :)
  • 我无法决定您是否应该这样做。如果它解决了你的问题,那就去做吧——但我不能告诉你这是否会向其他不应访问它的用户打开这条路线
  • 好的,我尝试在上面添加它但没有用,所以我在下面添加了它,它有效但随后因其他用户而中断。
【解决方案2】:

我需要在 /admin/stats URL 的 security.yaml 文件中添加额外的一行或“安全模式”。

正如 Nico 指出的那样,只有角色 ROLE_ADMIN 的用户才能访问以 /admin

开头的路径

因此,我在 ^/admin 路径下方添加了以下行,但这不起作用。我将它移到该路径上方,它可以工作,但随后为其他用户破坏了页面,因此安全模式的顺序非常重要

{ path: ^/admin/stats, roles: ROLE_EXPL, requires_channel: '%https%' } 

我发现你可以添加多个角色,这很有效:

 access_control:
        - { path: ^/admin/stats, roles: [ROLE_EXPL,ROLE_ADMIN], requires_channel: '%https%' }
        - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: '%https%' }
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%https%' }
        - { path: ^/forgotten_password, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%https%' }
        - { path: ^/reset_password, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%https%' }

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多