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

Posted

技术标签:

【中文标题】Symfony2 在未登录时将 /admin/* 重定向到 /admin/login(或使用 FOSUserBundle?)【英文标题】:Symfony2 redirect /admin/* to /admin/login when not logged in (or use FOSUserBundle?) 【发布时间】:2016-08-27 19:15:01 【问题描述】:

我是 Symfony 的新手,我正在尝试构建一个管理界面。我有一个现有的用户表,我想要的只是使用/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 时,我得到错误页面“访问此资源需要完全身份验证”。我想要的是应用程序在未登录时从/admin/*(当然/admin/login 除外)重定向到/admin/login

注意事项和其他问题

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

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

【问题讨论】:

将您的 check_path 更改为仅 /admin/login(可以使用与 login_path 相同的路径)。事实并非如此,访问 /admin/login_check 需要管理员权限。在这种情况下,FOSUserBundle 不会给你买任何东西。事实上,尽管它是目前最受欢迎的捆绑包,但遗憾的是它的维护不足。 【参考方案1】:

你应该改变防火墙的顺序,所以把 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,然后我们得到错误页面“访问此资源需要完全身份验证。”。

另外,如果你在主防火墙中添加模式,你就不会出现错误(见上面的例子)

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

【讨论】:

关于 fosuserbundle 是一个建立在 Symfony 安全系统之上的库,它提供注册、登录、密码重置等功能。它内置了对 MongoDB 以及 Doctrine 等 ORM 的支持, Propel 等 FOSUserBundle 要求我们创建一个需要持久化到数据库中的 User 实体。该包已经提供了一个抽象基类,其中包含我们需要的大部分字段。我们只需要创建扩展这个基类的实体。 现在我在将 admin_area 移到 main 上方后得到一个重定向循环。有什么想法吗? Nvm 修复了它。介意编辑你的答案并解释为什么 admin_area 应该在main 之前?谢谢

以上是关于Symfony2 在未登录时将 /admin/* 重定向到 /admin/login(或使用 FOSUserBundle?)的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - 访问被拒绝

某些服务在未由其他服务或程序使用时将自动停止

MySQL服务启动:某些服务在未由其他服务或程序使用时将自动停止

Symfony2 FosUserBundle 角色 ROLE_ADMIN

Symfony2/FOSUserBundle - 多个包的路由问题

本地计算机上的MySQL80服务启动后停止,某些服务在未由其他服务或者程序使用时将自动停止 亲测有效