Vaadin 8(没有 Spring Boot/Security)和 Keycloak 不起作用

Posted

技术标签:

【中文标题】Vaadin 8(没有 Spring Boot/Security)和 Keycloak 不起作用【英文标题】:Vaadin 8 (withouth Spring Boot/Security) and Keycloak not working 【发布时间】:2020-08-29 10:21:22 【问题描述】:

我有一个使用 Vaadin 8 构建的“旧版”应用程序,我需要使用 Keycloak 来保护它。 不幸的是,甚至没有触发到 Keycloak 的重定向。

作为测试,我创建了一个 Spring Boot 应用程序并尝试使用 Keycloak 对其进行保护,但没有任何问题,但它无法使用 Vaadin 8。

我的 Spring Boot 应用程序的配置文件是;

application.properties

keycloak.realm=myrealm
keycloak.resource=test-app
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.ssl-required=external
keycloak.public-client=true

keycloak.securityConstraints[0].authRoles[0]=Patient
keycloak.securityConstraints[0].authRoles[1]=Admin
keycloak.securityConstraints[0].securityCollections[0].name=boeken
keycloak.securityConstraints[0].securityCollections[0].patterns[0]=/books

keycloak.securityConstraints[1].authRoles[0]=Admin
keycloak.securityConstraints[1].securityCollections[0].name=backend
keycloak.securityConstraints[1].securityCollections[0].patterns[0]=/manager

server.port=8090

KeycloakConfig 类

@Configuration
public class KeycloakConfig 

    @Bean
    public KeycloakSpringBootConfigResolver keycloakConfigResolver() 
        return new KeycloakSpringBootConfigResolver();
    

只要加上这个,Keycoal-redirect就会被触发,我就可以登录了。很简单。

当我尝试保护 Vaadin 8 应用程序时,我应该更改/添加什么? 它不是 Spring/Spring 启动应用程序(不是由 SpringApplication.run() 启动的),我不认为必须有一个 Spring/Spring 启动应用程序才能使用 Keycloak 保护它(如果我错了,请纠正我)。 问题似乎是 application.properties 文件被忽略(尽管它位于类路径上),因为我可以导航到应该保护的 url。

有没有人看到遗漏/错误的地方?

【问题讨论】:

你试过什么?显然你不能在没有 Spring 的情况下使用 @Configuration@Beanapplication.properties 也是 Spring 特有的,所以你也不能使用它。 我几乎尝试了所有方法;添加了 Tomcat 适配器,关注了几十个 SO-topics,关注了使用 Vaadin 10 和 Spring 添加 Keycloak 的教程,......看起来 Spring 是必要的,但是将我的项目更改为 Spring(boot) 项目似乎很麻烦只是添加Keycloak....也许有人对 Vaadin 8 和 Keycloak 有经验,可以将我推向正确的方向。 为什么把项目改成Spring boot会很麻烦?没有这个工作将非常困难。 Vaadin 和 Keycloak 具有用于确保正确集成的 Spring 安全性插件/适配器。 【参考方案1】:

如果您考虑使用 Spring boot,我创建了 a working example of integration between Vaadin 8, Spring Boot and Keycloak。

它利用vaadin-spring-bootkeycloak-spring-boot-adapterkeycloak-spring-security-adapter 插件快速启动,您的application.properties 将被正确接收。本质上,这个设置告诉 Vaadin 让 Spring Security 处理所有安全性,然后 Keycloak 被连接为安全处理程序。

唯一需要的配置是自定义SecurityConfiguration 来定义您的特定安全需求。

但大部分归结为:

@Configuration
@EnableWebSecurity
@EnableVaadinSharedSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter 
...
  @Override
  protected void configure(HttpSecurity http) throws Exception 
    http.httpBasic().disable();
    http.formLogin().disable();
    // disable spring security csrf as Vaadin already provides this
    // also possible to disable this in Vaadin and leave this enabled
    http.csrf().disable();
    http
        .authorizeRequests()
        .antMatchers("/vaadinServlet/UIDL/**").permitAll()
        .antMatchers("/vaadinServlet/HEARTBEAT/**").permitAll()
        .anyRequest().authenticated();
    http
        .logout()
        .addLogoutHandler(keycloakLogoutHandler())
        .logoutUrl("/sso/logout").permitAll()
        .logoutSuccessUrl("/");
    http
        .addFilterBefore(keycloakPreAuthActionsFilter(), LogoutFilter.class)
        .addFilterBefore(keycloakAuthenticationProcessingFilter(), BasicAuthenticationFilter.class);
    http
        .exceptionHandling()
        .authenticationEntryPoint(authenticationEntryPoint());
    http
        .sessionManagement()
        .sessionAuthenticationStrategy(sessionAuthenticationStrategy());
  
...

【讨论】:

以上是关于Vaadin 8(没有 Spring Boot/Security)和 Keycloak 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Vaadin 10没有在Spring-Boot中使用模板

使用Maven和Spring Boot的Vaadin自定义组件/小部件

Vaadin4Spring 的 ManagedSecurity:如何更新用户列表?

如何使用 Spring Security 保护 Vaadin 流应用程序

使用 Vaadin 和 Spring (MySQL DB) 运行应用程序时出现问题

使用带有 Spring Security 的 Vaadin 出现 403 CSRF 令牌错误