Jak ustawić formularz logowania dla administratorów i inny dla innych użytkowników korzystających z FOSUserBundle?

Mając backend dla administratorów, warto mieć formularz logowania, a jednocześnie mieć normalny formularz logowania dla zwykłych Użytkowników w publicznej części naszej strony internetowej.

Czy jest to możliwe przy użyciu FOSUserBundle? Jak można to zrobić "w sposób Symfony2"?

Author: David Morales, 2013-06-21

2 answers

Najpierw musimy skonfigurować specjalne Trasy dla obszaru administracyjnego:

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 }

Następnie skonfiguruj specjalną zaporę dla obszaru administracyjnego używającego tych tras i zdefiniuj anonimowy dostęp do nich:

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 }
Ok! Właśnie rozdzieliliśmy nasz system logowania na dwie części: admin i main. Nadpiszmy SecurityController. W tym celu musimy utworzyć niestandardowy pakiet, którego rodzicem jest FOSUserBundle(sprawdź dokument). W tym nowym pakiecie Utwórz Kontroler:
<?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);
    }
}
To jest to! Teraz możesz napisać swój Adminbundle: Security: login.html.gałązka:)

Uwaga: nie zapomnij użyć tras administratora w swoim obszarze administracyjnym! (w akcji formularz logowania, link wylogowania, itp.)

 24
Author: David Morales,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-21 17:18:55

Odnośnie zatwierdzonej odpowiedzi, wprowadziłem kilka poprawek w moim projekcie Symfony 3.2.8, aby działać poprawnie.

Zamiast $requestAttributes = $this->container->get('request')->attributes; w kontrolerze bezpieczeństwa użyłem $requestAttributes = $this->container->get('request_stack')->getCurrentRequest();.

 1
Author: Kiriakos Papachristou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 13:36:08