Furkan Hakan
Furkan Hakan

Reputation: 23

Symfony 4: FOSUserBundle : Override Controller

I want to separate the admin login page and user login page. I did it this way with the codes I got from some sources, but I get an error.

// config/security.yaml

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    encoders: ...

role_hierarchy: ...


# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
    fos_userbundle:
        id: fos_user.user_provider.username

firewalls:
    dev:
        ...
    admin:
        pattern:            /admin(.*)
        form_login:
            provider:       fos_userbundle
            login_path:     /admin/login
            check_path:     /admin/login_check
            default_target_path: /admin/
        logout:
            path:           /admin/logout
            target:         /admin/login
        anonymous:    true
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager

        logout:       true
        anonymous:    true

# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
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 }
    - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }

The routes.yaml file is as follows.

admin_login:
  path:  /admin/login
  defaults: { _controller: App\UserBundle\Controller\SecurityController }

and The SecurityController file is as follows.

<?php

namespace App\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as BaseController;

class SecurityController extends BaseController
{

    public function renderLogin(array $data)
    {
        $requestAttributes = $this->container->get('request')->attributes;

        if ('admin_login' === $requestAttributes->get('_route')) {
            $template = sprintf('admin/Security/login.html.twig');
        } else {
            $template = sprintf('@FOSUser/Security/login.html.twig');
        }

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

I wrote this way, but when I enter the admin / login page, I get an error like the one below.

This page isn’t working
127.0.0.1 redirected you too many times.

ERR_TOO_MANY_REDIRECTS

How can I fix this error.

Upvotes: 1

Views: 364

Answers (1)

Dylan KAS
Dylan KAS

Reputation: 5663

You are having too many redirect because symfony is reading top to bottom and /admin/ is written before /admin/login or /admin/login_check so it will match with this access control.

Access control (Symfony):

For each incoming request, Symfony checks each access_control entry to find one that matches the current request. As soon as it finds a matching access_control entry, it stops - only the first matching access_control is used to enforce access.

So you need to put your /admin_login before your /admin

Update your access control with something like :

access_control:
  - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
  - { 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 }

Upvotes: 1

Related Questions