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?)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL服务启动:某些服务在未由其他服务或程序使用时将自动停止
Symfony2 FosUserBundle 角色 ROLE_ADMIN