当前位置: 首页 > 知识库问答 >
问题:

Symfony 3,一个应用程序中有2个防火墙

谷梁俊楚
2023-03-14

我在symfony 3中遇到了防火墙问题。三天以来,我一直在努力解决这个问题。我已经阅读了文档,并根据它做了所有事情,但应用程序并没有像我预期的那个样工作。

目标:所有页面(登录页面除外)都需要登录用户。如果用户未登录,则应将其重定向到/login页面。这就是全部。

根据这几页:

  • http://symfony.com/doc/current/book/security.html
  • http://symfony.com/doc/current/cookbook/security/form_login_setup.html

我已经创建了带有登录操作和表单的控制器。login_path和check_path使用相同的操作(根据留档)。可能security.yml出了问题,因为它不能正常工作。我的设置:

security:
providers:
    in_memory:
        memory:
            users:
                aaa:
                    password: aaa
                    roles: 'ROLE_ADMIN'
encoders:
    Symfony\Component\Security\Core\User\User: plaintext
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    login_firewall:
        pattern:    ^/login
        anonymous: ~
#       form_login:
#           login_path: /login
#           check_path: /login
    secured_area:
        pattern:    ^/
        form_login:
            login_path: /login
            check_path: /login
            default_target_path: homepage
        logout:
            path:   /logout
            target: /login
#    access_control:
#        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
#        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

我的登录操作:

<?php
/**
 * @Route("/login", name="login")
 */
public function loginAction(Request $request)
{
    $authenticationUtils = $this->get('security.authentication_utils');
    // get the login error if there is one
    $error = $authenticationUtils->getLastAuthenticationError();
    // last username entered by the user
    $lastUsername = $authenticationUtils->getLastUsername();

    return $this->render(
        'security/login.html.twig',
        array(
            // last username entered by the user
            'last_username' => $lastUsername,
            'error'         => $error,
        )
    );
}
?>

问题:

  1. 使用此配置,我无法登录。请求使用登录操作,但系统不想对我进行身份验证。

请帮帮我。我相信这很简单,但我在Symfony是新手,我看不到。

更新

多亏了Tobias Xy,我更正了security.yml。工作版本:

security:
    providers:
        in_memory:
            memory:
                users:
                    smt:
                        password: smt
                        roles: 'ROLE_ADMIN'
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: ~
            form_login:
                login_path: /login
                check_path: /login
                default_target_path: /
            logout:
                path:   /logout
                target: /login
    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

共有1个答案

柳俊健
2023-03-14

修复:

我建议:

  1. 完全删除登录防火墙。
  2. 允许匿名用户进入您的安全区域(匿名:~)
  3. 取消对访问控制部分的注释(内容看起来不错)

让我知道它是否有效。

替代修复:

(这可能行得通,但我不是100%确定)。

  1. 将您的检查路径更改为其他内容(例如/检查登录)
  2. 为/check\u登录创建一个空路由(类似于注销路由,此处描述:安全-注销)
  3. (确保此新路径位于“安全区域”防火墙后面!)

一些解释:

您的问题可能可以通过以下页面来解释:如何构建传统的登录表单。上面写着:

如果您使用多个防火墙,并且针对一个防火墙进行身份验证,则不会自动针对任何其他防火墙进行身份验证。不同的防火墙就像不同的安全系统。

这解释了您的一些问题:如果您取消login_firewall中的form_login,您将仅向登录页面进行身份验证!一旦您转到另一个页面,您将不再进行身份验证,因为这是一个不同的安全上下文。

我不是100%确定你的问题1,但它可能会发生,因为你的“检查路径”也在防火墙登录防火墙后面,并且不安全。由于登录防火墙中没有表单登录,因此提交的登录表单将无法识别。

 类似资料:
  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 本文向大家介绍symfony3 4.创建Symfony应用程序,包括了symfony3 4.创建Symfony应用程序的使用技巧和注意事项,需要的朋友参考一下 示例 Symfony Installer可用后,使用新命令创建第一个Symfony应用程序: 该命令可以在任何地方运行,而不必在htdocs文件夹中运行。 此命令将my_project_name/基于新的可用稳定Symfony版本创建一个名

  • 我成功地安装了JProfiler远程探测,我看到它在“catalina.out”(Tomcat)中运行。唯一的问题是远程机器上的所有端口都有防火墙(80和8080除外),无论我选择哪个端口,JProfiler GUI都无法连接到远程探测。 我尝试使用PuTTY隧道,但我不确定如何设置隧道规则。此外,JProfiler中似乎没有“网络首选项”,我可以在其中指定SOCKS代理。 我如何在不影响防火墙规

  • 我有一个java应用程序,它在运行时会产生另一个JVM。然而,我想使用jpack打包我的应用程序,它运行得很好。但是在运行时,当我的应用程序尝试使用调用下一个JVM时 我必须知道,应用程序是使用定制的JVM启动的,并且没有像“java”这样的命令。所以我得到的错误是这个java。无法执行getAbsolutePath()。 如果没有java可执行文件,我的应用程序如何在单独的进程中运行另一个jar

  • 问题内容: 有什么方法可以配置多个工作进程和/或Web进程以在单个Heroku应用程序容器中运行?还是必须将其分解为多个Heroku应用程序? 例如: 问题答案: 所有进程必须具有唯一的名称。 此外,名称 和 无关紧要,没有特殊含义。 唯一带有重要名称的进程是该进程,如Heroku文档中所述: Web进程类型是特殊的,因为它是唯一将从Heroku路由器接收HTTP流量的进程类型。其他过程类型可以任

  • 问题内容: 我读到每个应用程序都在自己的JVM中运行。为什么会这样呢?他们为什么不让一个JVM运行2个或更多应用程序? 我说的是通过公共静态void main(String [])方法启动的应用程序…) 问题答案: (我假设您正在谈论通过方法启动的应用程序…) 理论上,您可以在JVM中运行多个应用程序。实际上,它们可以以各种方式相互干扰。例如: JVM具有一组System.in/out/err,一