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

标签 symfony fosuserbundle

当有一个管理员用户的后端时,有一个登录表单很有趣,同时在我们网站的公共(public)区域有一个普通用户的正常登录表单。

使用 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(请查看文档)。在这个新包中,创建 Controller :
<?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);
    }
}

就是这样!现在您可以编写 AdminBundle:Security:login.html.twig :)

注意:不要忘记使用管理区域中的管理路由! (在登录表单操作、注销链接等中)

关于symfony - 如何使用 FOSUserBundle 为管理员和其他用户设置登录表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240827/

相关文章:

symfony - 自 Symfony 2.8 以来生成 bundle 时询问多应用程序的新选项

所有子域的 Symfony2 session

symfony - 如何为 FOSUserbundle 注册添加确认复选框

symfony - 如何在 Symfony 4 中覆盖 FOSUserBundle 表单

php - Doctrine2 ORM 不会刷新在脚本之外更改的对象

symfony - SonataAdmin Bundle 的非空字段

php - 如何使用 Symfony 中的 FosUserBundle 访问用户管理器作为服务?

symfony - FOSUserBundle/RegistrationController 参数太少

php - FOSUserBundle BCryptPasswordEncoder 加盐

php - Symfony Doctrine 防止特定实体的记录删除