【问题标题】:FOS UserBundle access controll doesn't workFOS 用户捆绑访问控制不起作用
【发布时间】:2013-03-05 18:22:07
【问题描述】:

我的 symfony2 项目中安装了 FOS UserBundle。登录/注销有效,唯一的问题是,系统不会重定向/关闭我想要关闭的部分。 整个站点只能由登录用户访问。 但是我可以呼叫任何路线。

我在安全yml的访问控制部分填写了数据,但它不起作用。我可以调用 mydomain/de_CH/anything/i/want/ 并访问该内容。

这是我的 security.yml:

security:
  providers:
    fos_userbundle:
      id: fos_user.user_provider.username_email

  encoders:
    FOS\UserBundle\Model\UserInterface: sha512

  firewalls:
    main:
      pattern: ^/
      form_login:
        provider: fos_userbundle
        login_path: fos_user_security_login 
        check_path: fos_user_security_check
        csrf_provider: form.csrf_provider
      logout:
        path:   fos_user_security_logout
      anonymous:    true

  access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/my-admin/, role: ROLE_ADMIN }
    - { path: ^/$, role: ROLE_USER }
    #- { path: ^/$, role: ROLE_USER }

  role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

【问题讨论】:

  • 愚蠢的问题,但是您是否尝试过在新的隐身浏览器窗口中访问页面?你可能有一个会话 cookie
  • @Jaitsu:不。还是猜对了。

标签: symfony fosuserbundle access-control


【解决方案1】:

改变

- { path: ^/$, role: ROLE_USER }

 - { path: ^/.*, role: ROLE_USER }

这是因为,第一个正则表达式告诉您允许 ROLE_USER 使用该模式 / 的路径
因此,/foo/foo/bar 等模式不会从您的防火墙中捕获。

第二种模式覆盖后一种情况

【讨论】:

  • 这确实导致了重定向循环:(
【解决方案2】:

删除anonymous: true 部分并将/login 放到它自己的防火墙中,以便用户可以登录。 anonymous 部分允许匿名用户访问该防火墙。

firewalls:
    login_firewall:
        pattern:    ^/login$
        anonymous:  ~
    main:
        pattern: ^/
        form_login:
            # ...
        logout:
            path:   fos_user_security_logout

编辑:由于我们拒绝匿名用户访问该页面,我们需要为/login 创建单独的防火墙,否则他们将无法登录。 请参阅官方文档中的“避免常见陷阱”部分: http://symfony.com/doc/current/book/security.html 了解有关该主题的更多信息。

【讨论】:

  • 所有用户都可以登录。看access_control部分
  • 如果你禁用匿名用户,它不会是
  • anonymous: true ...匿名未禁用
  • 阅读我的整个帖子。在解决方案中,我建议它位于main 防火墙中。
  • 我并不是说你的方法行不通。我是说我的解决方案在严格将未认证区域与安全区域分开的意义上更清洁。它的效率也略高一些,因为需要的检查更少 - 使用您在每个请求中的方法,安全组件可确保用户不是匿名的。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2019-01-31
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多