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"?
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.)
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();
.
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