Symfony2在未登录时将/admin/*重定向到/admin/login(或使用FOSUserBundle?)


Symfony2 redirect /admin/* to /admin/login when not logged in (or use FOSUserBundle?)

我是Symfony的新手,正在尝试构建一个管理界面。我有一个现有的用户表,我只想在/admin/login上使用登录页来保护^/admin.+路径,Symfony似乎非常注重教程,几乎没有解释如何自定义任何内容。(或者至少,没有太多关于每个部件如何与其他部件协同工作的信息)

这是我的安全。yml

encoders:
    AppBundle'Entity'Users:
        algorithm:        sha1
        encode_as_base64: false
        iterations:       1
role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]
providers:
    administrators:
        entity: { class: AppBundle:Users, property: email }
    in_memory:
        memory: ~
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        anonymous: ~
    admin_area:
        pattern:    ^/admin
        anonymous:  ~
        provider:   administrators
        form_login:
            default_target_path: /admin
            check_path: /admin/login_check
            login_path: /admin/login
            remember_me: true
        logout:
            path:   /admin/logout
            target: /admin
access_control:
    - { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: ROLE_ADMIN }

当我转到/admin时,我会收到一个错误页面,上面写着"访问此资源需要完全身份验证"。我希望应用程序在未登录时从/admin/*(当然除了/admin/login)重定向到/admin/login

笔记&其他问题

Symfony似乎希望您始终使用某些现有捆绑包,我在网上搜索了如何了解实际发生的事情的信息,但似乎只找到了越来越多的教程。

我应该使用FOSUserBundle吗?如果是,我可以使用现有的用户表吗?还是必须使用他们的模式?

您应该更改防火墙的顺序,因此在主之前设置admin_area

admin_area:
    pattern:    ^/admin
    anonymous:  ~
    provider:   administrators
    form_login:
        default_target_path: /admin
        check_path: /admin/login_check
        login_path: /admin/login
        remember_me: true
    logout:
        path:   /admin/logout
        target: /admin
main:
    anonymous: ~

说明

在我们的例子中,主防火墙不包含模式,那么如果按第一顺序定义,它将采用所有路由。所以在这个防火墙(主)中,我们没有定义form_login,然后我们得到错误页面,上面写着"访问这个资源需要完全身份验证"。

换句话说,如果您在主防火墙中添加模式,则不会出现错误(参见上面的示例)

main:
    pattern: /home
    anonymous: ~
admin_area:
    pattern:    ^/admin
    anonymous:  ~
    provider:   administrators
    form_login:
        default_target_path: /admin
        check_path: /admin/login_check
        login_path: /admin/login
        remember_me: true
    logout:
        path:   /admin/logout
        target: /admin