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

时间:2013-06-21 17:13:50

标签: symfony fosuserbundle

当为管理员用户提供后端时,有一个登录表单很有意思,同时在我们网站的公共区域为普通用户提供正常的登录表单。

使用FOSUserBundle可以吗?如何以“Symfony2”的方式完成?

2 个答案:

答案 0 :(得分:24)

首先,我们需要为管理区域配置一些特殊路由:

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);
    }
}

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

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

答案 1 :(得分:1)

关于批准的答案,我在Symfony 3.2.8项目中做了一些调整才能正常工作。

而不是 SELECT @columns = stuff((select DISTINCT ',' + quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ') ) from (select distinct action_note engagement_action where action_note is not null) n, action_party m, personal p where n.action_id = m.action_id and p.party_id = m.party_id and n.action_note like 'XXX' and m.system_name = 'XXXXXXXXXXXX' and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 在安全控制器中,我使用了$requestAttributes = $this->container->get('request')->attributes;