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

如何使用LoginFormAuthenticator和Login Link Authenticator为Symfony 5.2中的特定路径设置默认验证器

贲培
2023-03-14

我正在为我的客户使用Symfony 5.2中的新登录链接方法[1]。他们应该只使用这种身份验证方法。但我也使用登录表单身份验证[2]为我的管理员用户。

当未经身份验证的客户访问受限路径(在我的情况下 /app)时,他/她会被重定向到表单登录而不是登录链接表单。当会话已经过期或者如果他们访问(未经验证的)限制区域内的带书签的链接时也是如此。

如何设置/app resp的默认验证器/管理我想要这样的东西:

  • 客户区/应用程序-

我的security.yaml如下所示:

security:
    encoders:
        App\Entity\User:
            algorithm: auto

    enable_authenticator_manager: true
    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false    
        main:
            lazy: true
            provider: app_user_provider
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
            login_link:
                check_route: login_check
                signature_properties: ['id']
                max_uses: 1
            logout:
                path: app_logout

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/app, roles: ROLE_USER }
        - { path: ^/, roles: PUBLIC_ACCESS }

[1] 登录链接方式:https://symfony.com/doc/current/security/login_link.html
[2]LoginFormAuthenticator:https://symfony.com/doc/current/security/form_login_setup.html

共有1个答案

巫马心水
2023-03-14

好吧,我自己想出了一个解决办法。请让我知道,如果有更好的解决方案!

我覆盖了LoginFormAuthentiator类中的start()方法。在那里,我将$请求obj存储在一个私有类道具中,因为我不能覆盖getLoginUrl(),因为AbstractFormLoginAuthentiator类中的定义。然后我在getLoginUrl()方法中添加一些逻辑来检查用户想要访问哪个区域(/admin或 /app)并相应地重定向。就这样了。像魅力一样工作。;-)

// App\Security\LoginFormAuthenticator

    public const LOGIN_ROUTE                = 'admin_login';
    public const LOGIN_ROUTE_PASSWORDLESS   = 'app_login';

    ...

    private $request;

    ...

    /**
     * Override to control what happens when the user hits a secure page
     * but isn't logged in yet.
     *
     * @return RedirectResponse
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        $this->request = $request;
        $url = $this->getLoginUrl();

        return new RedirectResponse($url);
    }

    ...

    protected function getLoginUrl()
    {
        // Check if user would like to access /app
        $path = $this->request->getPathInfo();
        
        if ('/app' === substr($path, 0, 4)) {
            return $this->urlGenerator->generate(self::LOGIN_ROUTE_PASSWORDLESS);
        }

        return $this->urlGenerator->generate(self::LOGIN_ROUTE);
    }
 类似资料:
  • 我可以为我的vaadin fileupload组件设置默认上载路径吗?我想设置一些上载路径到我的vaadin组件。如果有人不选择上传任何文件,我的特定文件将被上传。有可能吗? 例如:I would like to do as

  • 我正在研究bean验证,我正在寻找一种可能性来设置我自己的bean验证注释的默认组。 我有这样的东西(工作): RequiredBySecondStepValidator.class(一个实现的约束验证器) secondstep.class(bean验证组) 不幸的是,根据规范,不可能在注释中设置默认组,如下所示:

  • 我在Windows10上使用hadoop文件系统3.3.0和hadoop java客户端api。下面是hadoop配置文件。 ==core-site.xml 当我执行hadoop命令接口时,输出如下所示, 保存文件的默认文件夹不包括在hadoop_home上,而是windows用户文件夹。如何修改默认保存文件夹?任何回复都是感谢的。最诚挚的问候

  • 问题内容: 因此,我创建了一个新的gradle项目,选择Java作为“其他库和框架”。 Gradle将编译并维护程序包结构, 但是项目结构->模块中的“模块编译输出路径”设置为。 这确实很烦人,并不是我每次创建新的Java项目时都要更改的东西。 我可以以某种方式更改默认设置,使其与gradle输出路径匹配吗? 问题答案: 您可以将Gradle pluigin用于INtelliJ 在: 然后,当您运

  • 我想解决我的类问题,你能告诉我怎么做吗? null

  • 问题内容: 我正在尝试制作Java RMI客户端/服务器应用程序。我在启动应用程序服务器端时遇到问题,因为在我尝试启动应用程序服务器端时,在调用Registry.bind()方法期间,它一直运行在 ClassNotFoundException 中。 我从这里的简单教程开始:http : //docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hell