簡體   English   中英

在 Spring Boot 中保護根 URL

[英]Securing the root URL in Spring Boot

我正在嘗試使用 Keycloak 保護 Spring Boot 應用程序並通過 Java 而不是 XML 對其進行配置。 我的 SecurityConfig 類如下所示:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class,
        excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver keycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .anyRequest().hasRole("admin");
    }
}

根據我的理解,如果用戶當前未登錄,則對anyRequest的調用應確保所有請求都被重定向到 KeyCloak 登錄頁面。但是,這似乎只適用於不是根 URL 的 URL。 該項目目前有兩個端點,“/”“/sync”。 嘗試正確訪問同步端點會重定向到登錄頁面。 嘗試訪問根頁面沒有,所以它似乎被忽略了。 我也試過使用antMatchers("*", "**", "/", "/*", "/**").hasRole("admin") ,但這些模式似乎都沒有導致根要保護的 URL。

罪魁禍首似乎是對super.configure(http)的調用。 然而,這會執行一些相對重要的事情,比如 CSRF 保護、登錄/退出端點等。 下面是提取到方法中的等效代碼,而不是超級調用:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().requireCsrfProtectionMatcher(this.keycloakCsrfRequestMatcher())
                .and().sessionManagement().sessionAuthenticationStrategy(this.sessionAuthenticationStrategy())
                .and().addFilterBefore(this.keycloakPreAuthActionsFilter(), LogoutFilter.class)
                .addFilterBefore(this.keycloakAuthenticationProcessingFilter(), BasicAuthenticationFilter.class)
                .addFilterBefore(this.keycloakAuthenticatedActionsFilter(), BasicAuthenticationFilter.class)
                .addFilterAfter(this.keycloakSecurityContextRequestFilter(), SecurityContextHolderAwareRequestFilter.class)
                .exceptionHandling().authenticationEntryPoint(this.authenticationEntryPoint())
                .and().logout().addLogoutHandler(this.keycloakLogoutHandler()).logoutUrl("/sso/logout").permitAll().logoutSuccessUrl("/");

        http.authorizeRequests()
                .anyRequest().hasRole("admin");
    }

顛倒超級調用和我自己的授權碼之間的順序也沒有導致根 URL 受到保護。

默認情況下,logoutSuccessUrl 是“/”,因此是不安全的,為了保護“/”,您需要更改它。

.and().logout().logoutSuccessUrl("/logout-success")

我還建議您使用 keycloak-spring-boot-starter

我剛剛遇到了同樣的問題,您需要將 logoutSuccessUrl 更改為要保護的“/”以外的其他內容。

.and().logout().addLogoutHandler(this.keycloakLogoutHandler()).logoutUrl("/sso/logout").permitAll().logoutSuccessUrl("/");

.and().logout().addLogoutHandler(this.keycloakLogoutHandler()).logoutUrl("/sso/logout").permitAll().logoutSuccessUrl("/somethingelse");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM