具有 vaadin 和 spring 安全性的 Keycloak
Keycloak with vaadin and spring security
我想使用 keycloak 和 spring 安全性来保护我的 vaadin 应用程序。我尝试使用"keycloak-spring-security-adapter"。
我的问题是我还希望未经身份验证的用户使用我的应用程序,但功能较少 - 我使用方法安全性来执行此操作并检查当前用户在 UI.
中具有哪些角色
我可以配置过滤器以使其忽略未经身份验证的请求,但如果存在令牌则使用它吗?
谢谢
丹尼尔
可以在 public-access branch of this github project 中找到您想要的工作示例。不过它确实使用了 Vaadin 8。
本质上,您可以将您的应用程序设置为部分 public,即某些部分可供未经身份验证的用户访问,而其他部分需要登录,如下所示:
@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();
http.csrf().disable();
http
.authorizeRequests()
.antMatchers("/vaadinServlet/UIDL/**").permitAll()
.antMatchers("/vaadinServlet/HEARTBEAT/**").permitAll()
.anyRequest().permitAll();
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());
}
...
}
行 http.anyRequest().permitAll();
是最重要的,您可以在其中将过滤器配置为仅允许所有请求。您仍然可以将其更新为仅允许 public 访问某些网址。
然后您可以在 methods/views/components 上使用 spring 安全注释来配置您的细粒度访问控制。例如:
@SpringComponent
@Secured("ROLE_ANONYMOUS")
public class LoginOperation implements Runnable {
@Override
public void run() {
// login logic
}
}
和
@Secured("ROLE_USER")
public class LogoutOperation implements Runnable {
@Override
public void run() {
// logout logic
}
}
我想使用 keycloak 和 spring 安全性来保护我的 vaadin 应用程序。我尝试使用"keycloak-spring-security-adapter"。 我的问题是我还希望未经身份验证的用户使用我的应用程序,但功能较少 - 我使用方法安全性来执行此操作并检查当前用户在 UI.
中具有哪些角色我可以配置过滤器以使其忽略未经身份验证的请求,但如果存在令牌则使用它吗?
谢谢
丹尼尔
可以在 public-access branch of this github project 中找到您想要的工作示例。不过它确实使用了 Vaadin 8。
本质上,您可以将您的应用程序设置为部分 public,即某些部分可供未经身份验证的用户访问,而其他部分需要登录,如下所示:
@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();
http.csrf().disable();
http
.authorizeRequests()
.antMatchers("/vaadinServlet/UIDL/**").permitAll()
.antMatchers("/vaadinServlet/HEARTBEAT/**").permitAll()
.anyRequest().permitAll();
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());
}
...
}
行 http.anyRequest().permitAll();
是最重要的,您可以在其中将过滤器配置为仅允许所有请求。您仍然可以将其更新为仅允许 public 访问某些网址。
然后您可以在 methods/views/components 上使用 spring 安全注释来配置您的细粒度访问控制。例如:
@SpringComponent
@Secured("ROLE_ANONYMOUS")
public class LoginOperation implements Runnable {
@Override
public void run() {
// login logic
}
}
和
@Secured("ROLE_USER")
public class LogoutOperation implements Runnable {
@Override
public void run() {
// logout logic
}
}