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

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

我是 Symfony 的新手,我正在尝试构建一个管理界面。我有一个现有用户 table,我想要的只是通过 /admin/login 处的登录页面保护 ^/admin.+ 路径,Symfony 似乎非常注重教程,很少解释如何自定义任何事物。 (或者至少,没有太多关于每个组件如何与其他组件一起工作的信息)

这是我的 security.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 时,我收到带有 "Full authentication is required to access this resource." 的错误页面 我想要的是将应用程序从 /admin/*(当然 /admin/login 除外)重定向到 /admin/login 未登录时。

注释和其他问题

Symfony 似乎希望你总是 使用某些现有的包,我在网上搜索了有关如何理解实际发生的事情的信息,但似乎只能找到越来越多的教程.

我应该使用 FOSUserBundle 吗?如果是这样,我可以使用现有用户 table 还是必须使用他们的架构?

你应该改变防火墙的顺序,所以 admin_area 在 main

之前
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 然后我们得到错误页面 "Full authentication is required to access this resource.".

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

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