此问题在此处已有答案:
How to use multiple login pages one for admin and the other one for user(1个答案)
4小时前关门了。
我在Sping Boot 应用程序中配置了Swagger,所有控制器都使用OAuth2协议进行保护,但我希望我的/swagger-ui/**
路径通过简单的用户名密码进行保护,可以在这里硬编码。我找不到一种方法来为不同的端点实现两种不同的身份验证。
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
LOGGER.debug("in configure HttpSecurity");
http
.mvcMatcher("/v1/**")
.authorizeRequests()
.mvcMatchers("/webhook/stripe/**").anonymous()
.mvcMatchers("/forgotPassword/**").anonymous()
.mvcMatchers("/public/**").anonymous()
// Any request simply requires authentication, regardless of permissions.
.anyRequest().authenticated()
.and()
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(jwt -> jwt
.decoder(jwtDecoder())
.jwtAuthenticationConverter(jwtAuthenticationConverter())
)
);
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
return http.build();
}
我尝试用Order(1)
创建另一个过滤器链-
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
UserDetails admin = User.withUsername("admin")
.password("12345")
.build();
http
.mvcMatcher("/swagger-ui/**")
.authorizeRequests()
.and()
.userDetailsService(new InMemoryUserDetailsManager(admin));
return http.build();
}
我期望它像过滤器链一样工作,并尝试首先对其进行身份验证,但它没有这样工作。
1条答案
按热度按时间bvn4nwqk1#
在
@Order
中的第一个SecurityFilterChain
中使用http.securityMatcher(...)
,以便它仅应用于少数路由,并将第二个顺序作为默认值(我将为这两个设置显式顺序,仅为第一个设置安全匹配器)。P.S.如果您为编程客户端设置此用户名/密码,您是否考虑过使用客户端凭据流来获取访问令牌,并仅使用资源服务器过滤器链来保护您的API?