3

背景

根据 Symfony 文档,登录表单需要在 security.yml 文件中指定,也是 login_check 路径。到目前为止,我的应用程序运行良好,用户尝试访问安全页面 (mysite.com/edit/123),如果他们没有登录,他们将被重定向到 /login,并且在他们登录后,他们将再次被重新定向到原来的预期路径 (/edit/123)。

类似的问题:Symfony 2 中的两个单独的登录页面

问题

现在的问题是,我需要一个不同的登录表单,比如说 /minimal_login,我需要将其包含在 security.yml 但我知道的唯一方法是创建一个不同的防火墙,正如我在文档中看到的那样,这会创建一个单独的识别方案,所以我想通过不同防火墙登录的用户不能共享相同的安全页面,这不是我想要的。

需要什么

如果用户尝试访问任何安全页面,但 /popup 他们将被重定向到 /login,但是如果他们尝试访问 /popup(并且他们没有登录),他们将被重定向到 /minimal_login。而且无论用户如何登录我的应用程序,他们将始终共享相同的访问权限,我的意思是,如果他们使用 /login 或 /minimal_login 登录,他们可以访问相同的页面。


我的安全.yml

jms_security_extra:
    secure_all_services: false
    expressions: true

security:
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]

    providers:
        main:
            entity: {class: Done\PunctisBundle\Entity\User, property: username}

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            remember_me:
                key: %secret%
                lifetime: 3600
                path: /
                domain: ~
            pattern: ^/
            anonymous: ~
            form_login:
                login_path: /login
                check_path: /login_check
            logout:
                path:   /logout
                target: /


    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/signup, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/verification, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/popup/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/ajax/track, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/ajax/socialbox, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }

    encoders:
        Done\PunctisBundle\Entity\User:
            algorithm:   md5
            iterations: 1
            encode_as_base64: false
4

1 回答 1

6

我遇到了类似的问题,我使用firewall context配置解决了。

firewalls:
    somename:
        # ...
        context: my_context
    othername:
        # ...
        context: my_context

http://symfony.com/doc/current/reference/configuration/security.html#firewall-context

于 2013-09-13T08:00:13.773 回答