【问题标题】:Symfony 4 - two firewalls cause ERR_TOO_MANY_REDIRECTSSymfony 4 - 两个防火墙导致 ERR_TOO_MANY_REDIRECTS
【发布时间】:2018-09-14 09:06:39
【问题描述】:

我写这篇文章是因为之前对Using multiple firewalls cause ERR_TOO_MANY_REDIRECTS in Symfony 2 的回答没有帮助。 “主”防火墙似乎工作得很好,“管理员”是导致问题的一个。每次我尝试输入路径“http://localhost:8000/admin”时,它都会按原样重定向到“http://localhost:8000/admin_login”,但会进入重定向循环并因上述错误而崩溃。

security.yaml

security:
encoders:
    App\Entity\User:
        algorithm: bcrypt
    Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN
providers: 
    chain_provider:
            chain:
                providers: [in_memory, db_provider]
    in_memory:
        memory:
            users:
               theadmin:
                    password: iamadmin
                    roles: 'ROLE_SUPER_ADMIN'
    db_provider:
        entity:
            class: App\Entity\User
            property: email
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    admin:
        pattern: /admin
        anonymous: ~

        form_login: 
            username_parameter: _username
            login_path: /admin_login
            check_path: /admin_login
            provider: in_memory
            default_target_path: admin

        logout:
            path: /admin_logout
            target: /


    main:
        pattern: /
        anonymous: ~

        form_login: 
            username_parameter: _email
            login_path: /login
            check_path: /login
            provider: db_provider
            default_target_path: welcome

        logout:
            path: /logout
            target: /
access_control:
- { path: ^/welcome, roles: ROLE_USER }
- { path: ^/admin, roles: ROLE_SUPER_ADMIN }
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin_login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

AdminSecurityController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class AdminSecurityController extends AbstractController
{
    /**
     * @Route("/admin_login", name="admin_login")
     */

    public function admin_login(Request $request, AuthenticationUtils $utils)
    {
        $error = $utils->getLastAuthenticationError();

        $auth_checker = $this->get('security.authorization_checker');

        if ($auth_checker->isGranted('ROLE_SUPER_ADMIN')) {
            return $this->render('admin/dashboard.html.twig', [
                'controller_name' => 'AdminController',
            ]);
                } else{
                    return $this->render('admin_security/admin_login.html.twig', [
                        'error' => $error
                    ]);
        }
    }

    /**
     * @Route("/admin_logout", name="admin_logout")
     */

    public function admin_logout()
    {

    }
}

【问题讨论】:

    标签: php symfony symfony4


    【解决方案1】:

    the top to the bottom 分析访问控制条目。因此,您需要将 ^/admin_login 条目放在 ^/admin 之前。

    想象一下当前如何设置安全组件:

    1. 您访问登录表单,然后按提交
    2. 您(访客)被重定向到/admin_login 路径
    3. 安全组件遍历条目并将 /admin_login 与 ^/admin 条目匹配
    4. 因为它需要ROLE_SUPER_ADMIN,所以最终会出现循环

    之后记得清空缓存。

    【讨论】:

    • 谢谢!有效。但是现在,即使我访问 /welcome,我也不断被重定向到 /admin_login 而不是 /login
    • 关于上面的评论,现在一切正常。看来我不小心从模式中删除了“admin”:/admin
    • 很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多