FOS UserBundle访问控制不起作用

时间:2013-03-05 08:36:23

标签: symfony fosuserbundle access-control

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

我填写了我的安全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

2 个答案:

答案 0 :(得分:0)

更改

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

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

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

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

答案 1 :(得分:0)

删除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了解有关此主题的更多信息。