Spring Boot、Keycloak 和 Vaadin 集成问题

Spring Boot, Keycloak and Vaadin integration issue

我一直在玩spring boot,并成功地在不同的项目中分别使用Keycloak 和Vaadin。现在,我想将两者结合起来,以避免必须使用 Vaadin 实现我自己的安全性。我到目前为止的结果可以在这里找到:github project.

我是从shared security example given by vaadin4spring. I then added the Keycloak configuration as given by the keycloak-spring-security-adapter and the keycloak-spring-boot-adapter开始的。

我现在在让两者一起工作时遇到了障碍。当一切正常并且 运行 并且我导航到 localhost:8080 时,我收到以下错误:

{"timestamp":...,"status":401,"error":"Unauthorized","message":"Unauthorized","path":"/"}

没有触发重定向来使用 Keycloak 进行身份验证。但是,如果我导航到任何其他不受 Vaadin 管理的 url,例如localhost:8080/login,重定向被触发。

登录成功后,我可以无误地导航到localhost:8080。但是,任何操作仍然受到限制,安全视图仍然隐藏。

关于如何修复我的配置有什么想法吗?我认为这是由于 Vaadin 处理 CORS。

我使用 Keycloak Spring 安全适配器,在保护 UI 服务的根路径(“/”)时也遇到了一些问题。

我最终将 Spring MVC 配置为在用户尝试访问 UI 中的根路径时发送重定向:

@Bean
public WebMvcConfigurerAdapter forwardToEquipmentManager() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("redirect:/ui/home");
        }
    };
}

这样浏览器在请求根路径时被重定向到主路径并触发适配器逻辑。它只是工作。

显然,在我的设置中,系统在启动时会将用户注册为匿名用户,而不是尝试实际进行身份验证。

http.anonymous().disable();

将上面的代码片段添加到安全配置中可以防止这种情况发生,系统可以正确地将用户重定向到 KC 登录。

一旦我开始工作,我发现我的观点也被打破了。这是由于影响所有 bean 的方法安全代理设置。 Vaadin 需要实际 运行 时间 类 而不是代理,例如查找视图。

@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)

proxyTargetClass 更改为 true 可确保创建子类代理,避免与 Vaadin 发生任何冲突。

我将所有更改推送到 github 项目。