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
或 @Bean
。 application.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-boot
、keycloak-spring-boot-adapter
和keycloak-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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用Maven和Spring Boot的Vaadin自定义组件/小部件
Vaadin4Spring 的 ManagedSecurity:如何更新用户列表?
如何使用 Spring Security 保护 Vaadin 流应用程序