Taieb Baccouch
Taieb Baccouch

Reputation: 75

fosuserBundle multiple firewalls check path configuration

I am using Symfony2 2.3 and FosUserBundle. I am trying to create two firewalls. One for the administration section and the other for frontend. The front end firewall works fine but the admin one doesn't work and it displays this error You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.
Here is my code:
security.yml

# app/config/security.yml
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
    fos_userbundle:
        id: fos_user.user_provider.username

 # Par-feu
firewalls: 
    # Par-feu du Backoffice
    admin_secured_area:
        pattern: ^/admin/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            login_path: fos_admin_user_security_login
            check_path: fos_admin_user_security_check
            default_target_path: biginfo_admin_homepage # A modifier avec le nom de votre route d'accueil pour le Backoffice
        logout:
            path: fos_admin_user_security_logout
            target: fos_admin_user_security_login
        anonymous: true

    # Par-feu du FrontOffice
    front_secured_area:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            login_path: fos_user_security_login
            check_path: fos_user_security_check
        logout:
            path:        /logout
            target:      /
        anonymous:       true

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }               

SecurityController.php

    <?php

namespace Biginfo\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as BaseController;

class SecurityController extends BaseController {

    /**
     * Renders the login template with the given parameters. Overwrite this function in
     * an extended controller to provide additional data for the login template.
     *
     * @param array $data
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    protected function renderLogin(array $data) {
        $requestAttributes = $this->container->get('request')->attributes;

        /*
         * Teste de la route de provenance
         * Si route Backoffice login : redirection vers le template de connexion de l'administration
         * Sinon si route FrontOffice login : redirection vers le template de connexion du Frontoffice (l'original de FOSUserBundle)
         */
        if ($requestAttributes->get('_route') == 'fos_admin_user_security_login') {
            $template = sprintf('BiginfoAdminBundle:Security:login.html.twig');
        } else {
            $template = sprintf('FOSUserBundle:Security:login.html.twig');
        }

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

}

Biginfo\UserBundle\Resources\config\routing.yml

    biginfo_user_user:
    resource: "@BiginfoUserBundle/Resources/config/routing/user.yml"
    prefix:   admin/user

# Route de connexion au FrontOffice
fos_user_security_login:
    pattern: /login
    defaults: { _controller: FOSUserBundle:Security:login }

# Route de vérification de connexion au FrontOffice
fos_user_security_check:
    pattern: /check
    defaults: { _controller: FOSUserBundle:Security:check }
    requirements:
        _method: POST

# Route de déconnexion du FrontOffice
fos_user_security_logout:
    pattern: /logout
    defaults: { _controller: FOSUserBundle:Security:logout }

# Route de connexion au Backoffice
fos_admin_user_security_login:
    pattern:  ad/login
    defaults: { _controller: FOSUserBundle:Security:login }

# Route de vérification de connexion au Backoffice
fos_admin_user_security_check:
    pattern:  ad/check
    defaults: { _controller: FOSUserBundle:Security:check }
    requirements:
        _method: POST

# Route de déconnexion du Backoffice
fos_admin_user_security_logout:
    pattern:  /logout
    defaults: { _controller: FOSUserBundle:Security:logout }

How can I fix it?

Upvotes: 1

Views: 4403

Answers (1)

Sofien Benrhouma
Sofien Benrhouma

Reputation: 406

Security.yml

security: encoders: Symfony\Component\Security\Core\User\User: plaintext Company\AngularBundle\Entity\User: plaintext Company\AngularBundle\Entity\Admin: plaintext

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
   users:
       entity: { class: CompanyAngularBundle:User, property: username }
   admin:
       entity: { class: CompanyAngularBundle:Admin, property: username }

firewalls:
    admin_secured_area:
        pattern:   ^/admin
        anonymous: ~
        provider: admin
        form_login:
            login_path: /admin/login
            check_path: /admin/login_check
            default_target_path: /admin

    user_secured_area:
        pattern:   ^/
        anonymous: ~
        provider: users
        form_login:
            login_path: login
            check_path: login_check
            default_target_path: /home

routing.yml

login_check:

path: /login_check

admin_login_check:

path: /admin/login_check

Twig file

Action of login form should be like this

<form action="{{ path('login_check') }}" method="post">

Action of admin/login form should be like this

<form action="{{ path('admin_login_check') }}" method="post">

Upvotes: 2

Related Questions