Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何使用FOSUserBundle为管理员和其他用户设置登录表单?_Symfony_Fosuserbundle - Fatal编程技术网

Symfony 如何使用FOSUserBundle为管理员和其他用户设置登录表单?

Symfony 如何使用FOSUserBundle为管理员和其他用户设置登录表单?,symfony,fosuserbundle,Symfony,Fosuserbundle,当有一个后台管理员用户,它是有趣的有一个登录表单,同时有一个正常的登录表单在我们的网站的公共区域的正常用户 使用FOSUserBundle可以吗?如何以“Symfony2”的方式完成?首先,我们需要为管理区域配置一些特殊路由: admin_login: pattern: /admin/login defaults: { _controller: FOSUserBundle:Security:login } admin_login_check: pattern: /a

当有一个后台管理员用户,它是有趣的有一个登录表单,同时有一个正常的登录表单在我们的网站的公共区域的正常用户


使用FOSUserBundle可以吗?如何以“Symfony2”的方式完成?首先,我们需要为管理区域配置一些特殊路由:

admin_login:
    pattern:  /admin/login
    defaults: { _controller: FOSUserBundle:Security:login }

admin_login_check:
    pattern:  /admin/login_check
    defaults: { _controller: FOSUserBundle:Security:check }

admin_logout:
    pattern:  /admin/logout
    defaults: { _controller: FOSUserBundle:Security:logout }
接下来,使用这些路由为管理区域配置一个特殊防火墙,并将其定义为匿名访问:

firewalls:
  ...
  admin:
    pattern:            /admin/(.*)
    form_login:
      provider:       fos_userbundle
      login_path:     admin_login
      check_path:     admin_login_check
      default_target_path: yourproject_admin_default_index
    logout:
      path:           admin_logout
      target:         admin_login
    anonymous:        true
    context:          application

  main:
    pattern: ^/
    form_login:
      provider:      fos_userbundle
      csrf_provider: form.csrf_provider
    context:         application
    ...

access_control:
  ...
  - { 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 }
好的!我们刚刚将登录系统分为两部分:admin和main

让我们覆盖SecurityController。为此,我们需要创建一个自定义包,其父级为FOSUserBundle(请查看文档)。在此新捆绑包中,创建控制器:

<?php

namespace YourProject\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as BaseController;

/**
 * {@inheritDoc}
 */
class SecurityController extends BaseController
{
    /**
     * {@inheritDoc}
     */
    public function renderLogin(array $data)
    {
        $requestAttributes = $this->container->get('request')->attributes;

        if ('admin_login' === $requestAttributes->get('_route')) {
            $template = sprintf('AdminBundle:Security:login.html.twig');
        } else {
            $template = sprintf('FOSUserBundle:Security:login.html.twig');
        }

        return $this->container->get('templating')->renderResponse($template, $data);
    }
}

关于批准的答案,我在Symfony 3.2.8项目中做了一些调整,以便正确工作

而不是
$requestAttributes=$this->container->get('request')->属性

在安全控制器中,我使用了
$requestAttributes=$this->container->get('request_stack')->getCurrentRequest()

我遵循了您上面提到的所有说明,但它对我不起作用。当我调用/admin它们时,我被重定向到/login而不是/admin/login。您可以发送聊天邀请来详细讨论它吗?现在我被重定向到/admin/login,但收到错误消息“页面没有正确重定向”。。。。有什么建议吗?这是最干净的方法吗?我不明白为什么捆绑包中没有这样的功能,需要这样的功能不是很常见吗?!另外,为每个功能(例如重置密码)这样做有点烦人…您不需要访问控制中的
^/admin/login\u check$
,也不需要在
渲染登录中使用
sprintf