春季启动的Vaadin登录问题

Posted

技术标签:

【中文标题】春季启动的Vaadin登录问题【英文标题】:Vaadin login issue with spring boot 【发布时间】:2021-08-10 03:24:01 【问题描述】:

我对 Vaadin (v. 14.6.1) 和 Spring boot (v. 2.4.5) 有一个奇怪的问题。我已按照https://vaadin.com/learn/tutorials/securing-your-app-with-spring-security/setting-up-spring-security 中的说明来实现登录视图和安全设置。

当我加载应用程序并转到 localhost/8080 登录时,我输入了正确的凭据,但登录失败并显示消息

WARN 8184 --- [io-8080-exec-10] cvfscUidlRequestHandler : 从 0:0:0:0:0:0:0:1 收到的安全密钥无效

当我尝试使用相同的凭据再次登录时,登录成功。如果我注销并尝试再次登录,它工作正常。

我可以通过重新启动服务器并尝试再次登录来重现此问题。我在开发模式和生产模式下测试了这个问题,并得到了相同的行为。

【问题讨论】:

我不是 100% 确定,但它看起来像一个错误。如果收到的安全密钥与会话中存储的安全密钥不匹配,并且在第一个请求中您没有会话,则会引发异常。你能分享你的项目让我看看吗? 这里是代码的链接,github.com/lutfijd/VaadinLoginIssue 我可以重现该问题。我有一个类似的应用程序没有发生这个问题。我会及时通知你 谢谢 Simon,我可能应该早点澄清一下,我是 Vaadin 的新手,这是我正在试验的示例代码中的一个问题,请不要在上面花费太多时间。跨度> 【参考方案1】:

我发现您的代码有两个问题:

    SecurityUtils

ServletHelper 类已弃用,我认为这会导致问题。我用HandlerHelper替换它:

public class SecurityUtils 

    /**
     * Tests if the request is an internal framework request. The test consists of
     * checking if the request parameter is present and if its value is consistent
     * with any of the request types know.
     *
     * @param request
     *            @link HttpServletRequest
     * @return true if is an internal framework request. False otherwise.
     */
    static boolean isFrameworkInternalRequest(HttpServletRequest request) 
        final String parameterValue = request.getParameter(ApplicationConstants.REQUEST_TYPE_PARAMETER);
        return parameterValue != null && Stream.of(HandlerHelper.RequestType.values())
                .anyMatch(r -> r.getIdentifier().equals(parameterValue));
    
    缺少 Vaadin 插件(如果您使用 Maven 运行它,则必须运行准备前端)

pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-maven-plugin</artifactId>
            <version>$vaadin.version</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-frontend</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

【讨论】:

谢谢西蒙。在我添加您的更改之前,我尝试测试该应用程序并确保我仍然可以重现该问题,令我惊讶的是我不能。经过一段时间的挠头,我意识到我将应用程序上的服务器端口从 8080 更改为 80。不幸的是,您建议的更改在端口 8080 上并没有解决问题。我可以确认将服务器端口从 8080 更改到 80 实际上解决了这个问题,我反复使用不同的端口 # 启动服务器,以确保这不仅仅是侥幸。但问题始终在端口 80 上消失,并在端口 8080 上再次出现。 关于将 vaadin 前端插件添加到 pom 中,请记住这个 pom 是由 spring 初始化程序而不是我生成的,所以如果它不存在,我只能假设 Vaadin 团队或 spring 团队没有'认为他们在那里不需要它。

以上是关于春季启动的Vaadin登录问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vaadin 应用程序中使用单点登录

如何从春季启动重定向/转发角度页面?

我的春季启动webapp.war停止在ssh注销上运行。如何创建应用服务,以便在没有用户登录的情况下运行

使用 Spring Security OAuth2 和 Vaadin 流程登录 21

Vaadin - 在视图之间传递数据

Vaadin 多用户会话管理