[英]Vaadin 8 (withouth Spring Boot/Security) and Keycloak not working
我有一個使用 Vaadin 8 構建的“舊版”應用程序,我需要使用 Keycloak 來保護它。 不幸的是,甚至沒有觸發到 Keycloak 的重定向。
作為測試,我創建了一個 Spring 引導應用程序並嘗試使用 Keycloak 保護它而沒有任何問題,但它無法與 Vaadin 8 一起使用。
我的 Spring 引導應用程序的配置文件是;
應用程序屬性
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 class
@Configuration
public class KeycloakConfig {
@Bean
public KeycloakSpringBootConfigResolver keycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
}
只需添加此內容,就會觸發 Keycoal 重定向,我可以登錄。簡單。
當我嘗試保護 Vaadin 8 應用程序時,我應該更改/添加什么? 它不是 Spring/Spring 啟動應用程序(不是由 SpringApplication.run() 啟動的),我不認為必須擁有一個 Spring/Spring 啟動應用程序才能使用 Keycloak 保護它(如果我錯了,請糾正我)。 問題似乎是 application.properties 文件被忽略(盡管它位於 class 路徑上),因為我可以導航到應該保護的 url。
有誰看到缺少/錯誤的東西?
如果您考慮使用 Spring 引導,我創建了 Vaadin 8、Spring Boot 和 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());
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.