2017-04-20 60 views
1

我想確保我的vaadin應用與keycloak和彈簧安全。我嘗試使用「keycloak-spring-security-adapter」。 我的問題是我還希望未經驗證的用戶使用我的應用程序,但功能較少 - 我使用方法安全性並檢查當前用戶在UI中具有哪些角色。鑰匙巖與伐木因和彈簧安全

我可以配置過濾器,以便它忽略未經驗證的請求,但是如果令牌存在使用它?

感謝

丹尼爾

+0

你能提供你在你的方法和UI已經得到了一個例子嗎?我沒有使用Vaadin,但AFAIK的一切都是在Java中完成的(不是基於XML的視圖結構),不是嗎? –

+0

是的,它全部在java中。有一個映射到一個url的vaadin servlet,「vaadin-pages」通過ajax發送給瀏覽器 – dve

+0

然後,您可以使用使用spring安全性訪問角色的標準方式,並將視圖生成代碼片段包裝爲條件以呈現您希望取決於用戶具有什麼樣的訪問權限。 –

回答

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安全註釋來配置細粒度的訪問控制。 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 
    } 
}