我是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