Symfony:防火墙、多个登录表单
我对symfony并不陌生,但我一直使用Symfony:防火墙、多个登录表单,symfony,Symfony,我对symfony并不陌生,但我一直使用FOSUserBundle,默认情况下,这会阻止一个人使用两种不同的登录表单来验证两种不同的用户类型 我有两个实体,一个是管理员,另一个是用户。管理员只能在管理区登录,同样,用户也只能通过前端登录 我遵循了:这也导致了我 我的security.yml是: jms_security_extra: secure_all_services: false expressions: true security: encoders:
FOSUserBundle
,默认情况下,这会阻止一个人使用两种不同的登录表单来验证两种不同的用户类型
我有两个实体,一个是管理员
,另一个是用户
。管理员只能在管理区登录,同样,用户也只能通过前端登录
我遵循了:这也导致了我
我的security.yml是:
jms_security_extra:
secure_all_services: false
expressions: true
security:
encoders:
Symfony\Component\Security\Core\User\User: sha512
Fm\AdminBundle\Entity\Admins: sha512
Fm\MainBundle\Entity\Users: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
chain_provider:
chain:
providers: [in_memory, admin]
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
admin:
entity: { class: Fm\AdminBundle\Entity\Admins, property: username }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
anonymous: true
alogin:
pattern: ^/admin/login
security: false
login:
pattern: ^/login
security: false
secured_area:
pattern: ^/admin
anonymous: false
provider: chain_provider
switch_user: true
form_login:
check_path: /admin/login_check
login_path: /admin/login
logout:
path: /admin/logout
target: /admin
members_area:
pattern: ^/
anonymous: false
form_login: ~
logout:
path: /logout
target: /
#anonymous: ~
#http_basic:
# realm: "Secured Demo Area"
access_control:
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, roles: ROLE_ADMIN }
在我的路由中,我在文档中定义了路由:(默认为/admin/login和/admin/login\u check,因为我的主路由包括设置/admin的位置)
我在浏览器中遇到的错误是:
找不到路径“/admin/login\u check”的控制器。可能您忘记在路由配置中添加匹配的路由?
堆栈跟踪告诉我:警告-无法查找控制器,因为“\u controller”参数丢失
及
错误-Symfony\Component\HttpKernel\Exception\NotFoundHttpException:找不到路径“/admin/login\u check”的控制器。可能您忘记在路由配置中添加匹配的路由?(未捕获的例外)在/var/www/mysite.dev/symfony/app/bootstrap.php.cache line 1419
上,问题是在登录到“安全区域”防火墙后,您会被重定向到“/”,它位于“成员区域”防火墙后面。您不能从“安全区域”使用凭据访问“成员区域”(至少默认情况下不能)。阅读上的详细信息
如果查看安全配置(),您可以看到表单登录的默认路径为“/”。只需将此更改为/admin:
security:
...
firewalls:
...
secured_area:
pattern: ^/admin
...
form_login:
check_path: /admin/login_check
login_path: /admin/login
default_target_path: /admin
logout:
...
另一种方法是共享第一个链接()中描述的上下文。要在symfony 2XX中实现多个登录,请尝试以下代码 Security.yml 路由.yml 树枝锉 登录表单的动作应该是这样的 管理员/登录表单的操作应如下所示
这是一个简单的正则表达式问题。在你的alogin防火墙中尝试
^/admin/login$
,以防止登录检查不在防火墙后面。编辑:登录coureThat“似乎”也一样,不过我相信我的安全性。yml拥有“provider:chain_provider”应该可以使用内存和管理提供程序(如所列)。。。如果我输入用户名admin和密码admin pass,它会重定向回登录屏幕,错误为“坏凭证”(我目前在数据库中没有用户)。有什么想法吗?你确定你使用了正确的密码吗?密码应该是adminpass
,而不是adminpass
。另外,检查您的日志中是否有来自Symfony安全组件的消息,以查看是否一切都按预期工作。这是因为其中一件事情上的sha512。。。我把它改成了一次迭代sha,并对密码进行了编码,它开始工作了。。。现在的问题是,在我登录后,它会将我重定向到domain.com/login,而不是domain.com/adminNewbie error/gotcha:请注意,如果您有^/和^/admin,则更具体的模式(^/admin)必须在文件中更通用的模式^/之上,否则它不会优先,因为^/仍然可以匹配^/admin-至少,这就是为什么我的应用程序在security.yml中也有一个^/模式,而我没有意识到这就是yml处理regex优先级的方式。你是如何解决这个模式的问题的。
security:
...
firewalls:
...
secured_area:
pattern: ^/admin
...
form_login:
check_path: /admin/login_check
login_path: /admin/login
default_target_path: /admin
logout:
...
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
Company\AngularBundle\Entity\User: plaintext
Company\AngularBundle\Entity\Admin: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
users:
entity: { class: CompanyAngularBundle:User, property: username }
admin:
entity: { class: CompanyAngularBundle:Admin, property: username }
firewalls:
admin_secured_area:
pattern: ^/admin
anonymous: ~
provider: admin
form_login:
login_path: /admin/login
check_path: /admin/login_check
default_target_path: /admin
user_secured_area:
pattern: ^/
anonymous: ~
provider: users
form_login:
login_path: login
check_path: login_check
default_target_path: /home
login_check:
path: /login_check
admin_login_check:
path: /admin/login_check
Action of login form should be like this
<form action="{{ path('login_check') }}" method="post">
Action of admin/login form should be like this
<form action="{{ path('admin_login_check') }}" method="post">