我不明白如何为索引页面配置我的security.yml文件

时间:2012-10-09 07:26:52

标签: symfony firewall fosuserbundle

我使用所需的身份验证(使用FOSUserBundle)开发了我的symfony2网站。 现在我决定为匿名访问者增加2个例外:索引页面(“/”)和联系表单(“/ contact”)。

当我修改我的security.yml时,这些会被破坏:

  • 在我的twig联系表单页面中,我的所有“{%if is_granted(”IS_AUTHENTICATED_REMEMBERED“)%}”不再起作用。这真的好像我不再被认证了。
  • 在我的树枝索引页面中,我也有同样的问题。

这是我的security.yml。我知道它可以是微不足道的,但是我没有在doc中找到它,我可以通过security.yml文件获得更多关于“让我与经过身份验证的会话生活保持联系”的信息。我尝试的一切都行不通。

security:
    encoders:
        "FOS\UserBundle\Model\UserInterface": sha512

    role_hierarchy:
        ROLE_AUTHOR:            ROLE_USER
        ROLE_ADMIN:             [ROLE_USER, ROLE_AUTHOR]

    providers:
        fos_userbundle:
            id: fos_user.user_manager

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

        login:
            pattern:   ^/(login$|register|resetting)
            anonymous: true

        token:
            pattern:    ^/administration/create-user/confirmation-token/
            anonymous: true

        #this is where it fail....
        contact:
            pattern:    ^/contact$
            anonymous: true

        index:
            pattern:    ^/$
            anonymous: true


        # Main Firewall
        main:
            pattern: ^/+
            form_login:
                provider:    fos_userbundle
                remember_me: true
            remember_me:
                key:         %secret%
            anonymous:       false
            logout:          true
            #http_basic:
            #    realm: "Secured Demo Area"

    access_control:
        #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

提前谢谢

2 个答案:

答案 0 :(得分:3)

你做错了:)你只需要几个防火墙。并非每个网址的每个防火墙。

以这种方式做到:

firewalls:
    main:
        pattern:        ^/
        switch_user:    true
        anonymous:      ~
        form_login:
            provider:   fos_userbundle
            login_path: /login
        logout:
            path:       /logout
access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

接下来将另一项添加到access_control中。

答案 1 :(得分:1)

您不必为联系人和索引创建不同的防火墙,而是必须将它们添加到access_control,因为它们应该由与应用程序其余部分(main)相同的冷壁处理,它们只是不同之处在于您要修改哪些角色可以访问它们:

main:
    pattern:        ^/
    ...
access_control:
    - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/contact$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
    #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

编辑以澄清: 像您一样指定不同的防火墙,将这些页面放在当前安全上下文之外,因此从防火墙主页登录不适用于这些防火墙。