Symfony 4:FOSUserBundle:覆盖控制器
Posted
技术标签:
【中文标题】Symfony 4:FOSUserBundle:覆盖控制器【英文标题】:Symfony 4: FOSUserBundle : Override Controller 【发布时间】:2020-11-11 20:08:23 【问题描述】:我想将管理员登录页面和用户登录页面分开。我使用从某些来源获得的代码以这种方式执行此操作,但出现错误。
// config/security.yaml
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
encoders: ...
role_hierarchy: ...
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
dev:
...
admin:
pattern: /admin(.*)
form_login:
provider: fos_userbundle
login_path: /admin/login
check_path: /admin/login_check
default_target_path: /admin/
logout:
path: /admin/logout
target: /admin/login
anonymous: true
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
logout: true
anonymous: true
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/, role: ROLE_ADMIN
- path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY
routes.yaml文件如下。
admin_login:
path: /admin/login
defaults: _controller: App\UserBundle\Controller\SecurityController
和SecurityController文件如下。
<?php
namespace App\UserBundle\Controller;
use FOS\UserBundle\Controller\SecurityController as BaseController;
class SecurityController extends BaseController
public function renderLogin(array $data)
$requestAttributes = $this->container->get('request')->attributes;
if ('admin_login' === $requestAttributes->get('_route'))
$template = sprintf('admin/Security/login.html.twig');
else
$template = sprintf('@FOSUser/Security/login.html.twig');
return $this->container->get('templating')->renderResponse($template, $data);
我是这样写的,但是当我进入管理/登录页面时,出现如下错误。
This page isn’t working
127.0.0.1 redirected you too many times.
ERR_TOO_MANY_REDIRECTS
我该如何解决这个错误。
【问题讨论】:
我认为您的“重定向过多”是因为您将登录路径设置为/admin/login
,但在此之前应用了/admin role:ROLE_ADMIN
的防火墙规则
是的,这就是问题所在。谢谢。
【参考方案1】:
因为 symfony 是从上到下读取,并且 /admin/
写在 /admin/login
或 /admin/login_check
之前,所以您有太多重定向,因此它将与此访问控制匹配。
Access control (Symfony):
对于每个传入的请求,Symfony 都会检查每个 access_control 条目以 找到一个与当前请求匹配的。一旦发现一个 匹配 access_control 条目,它会停止 - 只有第一个匹配 access_control 用于强制访问。
所以你需要把你的/admin_login
放在你的/admin
之前
使用以下内容更新您的访问控制:
access_control:
- path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/admin/, role: ROLE_ADMIN
【讨论】:
谢谢!有效。但现在“csrf_token”作为空值进入管理/登录页面。 我做到了。如果有人有同样的问题;$this->get('security.csrf.token_manager')->getToken('authenticate')->getValue();
这将解决你的工作。以上是关于Symfony 4:FOSUserBundle:覆盖控制器的主要内容,如果未能解决你的问题,请参考以下文章
无法自动装配服务 FOSUserBundle,Symfony 3.4
在验证用户与 Symfony 4 和 FOSUserBundle 连接后重定向用户
在 symfony 3.4 上安装 FOSUserBundle 时出错
Hwi oauth bundle 和 Symfony 3.4 无法自动装配服务:如何在 symfony 3.4 + FOSUserBundle 中使用 hwi/oauth-bundle