1

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

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

  • 在我的 twig 联系表单页面中,我所有的“{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}”都不再起作用了。真的就像我不再经过身份验证一样。
  • 在我的树枝索引页面中,我也有同样的问题。

这是我的security.yml。我知道这可能是微不足道的,但我没有在文档中找到它,在那里我可以通过 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 }

先感谢您

4

2 回答 2

3

你做错了:) 你只需要几个防火墙。不是每个 url 的每个防火墙。

这样做:

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。

于 2012-10-09T07:55:25.407 回答
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 }

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

于 2012-10-09T12:30:19.443 回答