java 自定义提供程序通过Spring 6 Basic Authentication在每个请求上执行

wkyowqbh  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(92)

目前正在将我的Web应用程序从Sping Boot 2升级到版本3。由于Sping Boot 3使用Spring 6,我需要更新我的安全配置。在我的更改之后,我注意到我的自定义身份验证提供程序在每个请求中都被调用,这导致了沉重的数据库流量。如果我使用spring默认登录表单,但使用基本身份验证,则不会发生这种情况。
以下是我的示例安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(new CustomAuthenticationProvider());
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authorize) -> authorize
                        .anyRequest().authenticated()
                )
                .httpBasic();
        return http.build();
    }
}

我的供应商看起来像:

public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {

        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        if ("admin".equals(username) && "admin".equals(password)) {
            var user = User.withUsername("admin").password("admin").authorities(new ArrayList<>()).build();
            return new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), user.getAuthorities());
        } else {
            throw new
                    BadCredentialsException("system authentication failed");
        }
    }

    @Override
    public boolean supports(Class<?> auth) {
        return auth.equals(UsernamePasswordAuthenticationToken.class);
    }
}

行为简而言之:
| 安全配置|行为|
| --------------|--------------|
| .formLogin()| 1x登录/提供商呼叫|
| .httpBasic()|每次会话1x登录/每次请求1x提供商呼叫|
我可以做些什么来恢复Spring 5 / Sping Boot 2的旧行为?

ttygqcqt

ttygqcqt1#

对于每个有相同问题的人,您可以通过在安全过滤器链中设置会话创建策略来恢复旧的会话行为:

.httpBasic(withDefaults())
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
...

相关问题