在Spring Security中只使用用户名密码保护特定路径,其他使用jwt令牌[重复]

tktrz96b  于 2023-03-23  发布在  Spring
关注(0)|答案(1)|浏览(111)

此问题在此处已有答案

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();
}

我期望它像过滤器链一样工作,并尝试首先对其进行身份验证,但它没有这样工作。

bvn4nwqk

bvn4nwqk1#

@Order中的第一个SecurityFilterChain中使用http.securityMatcher(...),以便它仅应用于少数路由,并将第二个顺序作为默认值(我将为这两个设置显式顺序,仅为第一个设置安全匹配器)。
P.S.如果您为编程客户端设置此用户名/密码,您是否考虑过使用客户端凭据流来获取访问令牌,并仅使用资源服务器过滤器链来保护您的API?

相关问题