gpt4 book ai didi

java - 保护 Spring Boot 中的根 URL

转载 作者:行者123 更新时间:2023-12-02 04:51:02 24 4
gpt4 key购买 nike

我正在尝试使用 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 保护、登录/退出端点等。以下是提取到该方法中的等效代码,而不是 super 调用:

    @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");
}

颠倒 super 调用和我自己的授权代码之间的顺序也不会导致根 URL 受到保护。

最佳答案

默认情况下logoutSuccessUrl是“/”,因此是不安全的,为了保护“/”,您需要更改它。

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

我还推荐您使用keycloak-spring-boot-starter

关于java - 保护 Spring Boot 中的根 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com