symfony - Symfony 4:FOSUserBundle:覆盖控制器
问题描述
我想将管理员登录页面和用户登录页面分开。我使用从某些来源获得的代码以这种方式执行此操作,但出现错误。
// 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
我该如何解决这个错误。
解决方案
你有太多的重定向,因为 symfony 是从上到下阅读并且/admin/
是在之前写的,/admin/login
所以/admin/login_check
它将与这个访问控制相匹配。
对于每个传入的请求,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 }
推荐阅读
- php - 如何获取选定的字符串单词?
- regex - 如何通过正则表达式使用精确的 gmail 或 yahoo 字词验证电子邮件地址?
- flutter - 未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'text'
- cmd - 如何在 Windows 10 命令提示符下将 * 字符作为命令行参数传递?
- acumatica - 如何向移动应用程序添加新操作
- r - 将所有图像保存在 R 中
- c++ - 使用 WinApi 禁用\启用音频设备
- javascript - Tippyjs - 如何将单击按钮上的数据值传递给模板
- angular - Angular 语言服务不适用于使用 cli 生成的新组件的 vs 代码
- ios - 泛型类型“结果”专用于类型参数太少(得到 1,但预期为 2)- swift 单元测试中的错误