带有vaadin和弹簧安全的Keycloak

时间:2017-04-20 09:22:36

标签: spring-security vaadin7 keycloak

我希望使用keycloak和spring security来保护我的vaadin应用程序。我尝试使用“keycloak-spring-security-adapter”。 我的问题是我还希望未经身份验证的用户使用我的应用程序,但功能较少 - 我使用方法安全性并检查当前用户在UI中具有哪些角色。

我是否可以配置过滤器以忽略未经身份验证的请求,但如果令牌存在则使用它?

由于

丹尼尔

1 个答案:

答案 0 :(得分:1)

可以在public-access branch of this github project中找到您想要的工作示例。它确实使用了Vaadin 8。

从本质上讲,您可以将应用程序设置为部分公开,即对某些部分可访问未经身份验证的用户,并需要登录其他人,如下所示:

@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();是最重要的。您仍然可以将此更新为仅允许公共访问某些网址。

然后,您可以在方法/视图/组件上使用spring security注释来配置细粒度的访问控制。 E.g:

@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
  }
}