我有一个像这样的application.yml:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8180/auth/realms/dev
spring-security:
provider:
default
spring-security:
provider:
keycloak
所以我在后台使用了钥匙斗篷,但我有一个
spring-security.provider
属性,可以是 default
和 keycloak
。
如果我使用
default
我不希望 Spring Security 工作,所以我什至不启动 keycloak。但是,如果设置了 spring.security.oauth2.resourceserver.jwt.issuer-uri
,它会尝试与我的 keycloak 建立连接,但事实并非如此。
如果
spring.security.oauth2.resourceserver.jwt.issuer-uri
设置为“默认”,我希望应用程序忽略 spring-security.provider
。
目前我有两个基于
spring-security.provider
的配置类:
@Configuration
@ConditionalOnProperty(prefix = "spring-security", value = "provider", havingValue = "default", matchIfMissing = true)
public class DefaultSecurityConfigurer {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.csrf()
.disable();
return http.build();
}
}
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
@RequiredArgsConstructor
@ConditionalOnProperty(prefix = "spring-security", value = "provider", havingValue = "keycloak", matchIfMissing = false)
@Configuration
public class KeycloakSecurityConfigurer {
private final SpringSecurity springSecurity;
private final RolesConverter authoritiesExtractor;
// @formatter:off
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange()
.pathMatchers(springSecurity.getApiMatcher())
.authenticated()
.pathMatchers("/**")
.permitAll()
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(grantedAuthoritiesExtractor());
return http.build();
}
@Bean
public Converter<Jwt, Mono<AbstractAuthenticationToken>> grantedAuthoritiesExtractor() {
return new ReactiveJwtAuthenticationConverterAdapter(authoritiesExtractor);
}
}
提前致谢。
您可以使用以下命令禁用 spring security 自动配置
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
主类上方的注释(包含 main 方法)
或者
通过将此配置添加到 application.properties 文件中:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
在某些特殊情况下,此设置还不够。
例如,几乎每个 Spring Boot 应用程序都是通过类路径中的 Actuator 启动的。这会导致问题,因为另一个自动配置类需要我们刚刚排除的类,因此应用程序将无法启动。
为了解决这个问题,我们需要排除该类;并且,针对 Actuator 的情况,我们需要排除 ManagementWebSecurityAutoConfiguration。
创建配置,例如在
src/main/resources
中:application-no-security.yml:
spring:
autoconfigure:
exclude: >
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,
org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration
激活它,例如:
@ActiveProfile("no-security")
class SomeTest {
...
}