programing

스프링 보안:WebSecurityConfigurer 어댑터가 없는 Global Authentication Manager

telebox 2023. 7. 26. 21:48
반응형

스프링 보안:WebSecurityConfigurer 어댑터가 없는 Global Authentication Manager

WebSecurityConfigurerAdapter를 제거하려고 합니다.Authentication Manager는 다음과 같이 구성됩니다.

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class DefaultSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    @Bean
    public AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    } 
 

  @Override
  protected void configure(AuthenticationManagerBuilder auth) 
  throws Exception {
            auth.userDetailsService(userDetailsService())
                    .passwordEncoder(passwordEncoder());
        }

WebSecurityConfigurerAdapteri를 사용하지 않고 다음과 같이 글로벌 AuthenticationManager를 정의합니다.

    @Configuration
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public static class DefaultSecurityConfig  {

        @Bean
        public AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth ) throws Exception {
            return auth.userDetailsService(userDetailsService())
                    .passwordEncoder(passwordEncoder()).and().build();
        }

그리고 나는 오류를 이해합니다.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultSecurityFilterChain' defined in class path resource [org/springframework/boot/autoconfigure/security/servlet/SpringBootWebSecurityConfiguration.class]: Unsatisfied dependency expressed through method 'defaultSecurityFilterChain' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception; nested exception is java.lang.IllegalStateException: Cannot apply org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration$EnableGlobalAuthenticationAutowiredConfigurer@536a79bd to already built object

Spring Boot v2.6.4를 사용하고 있습니다.

저는 여기에 잠시 갇혀 있습니다. 어떤 도움이라도 주시면 감사하겠습니다.

교체하다

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth ) throws Exception {
       return auth.userDetailsService(userDetailsService())
                  .passwordEncoder(passwordEncoder()).and().build();
    }

타고

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
            throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

내 프로젝트에서, 나는 사용할 필요가 있었습니다.AuthenticationManager사용자 지정 로그인을 수행합니다.그리고 선언합니다.

@RestController
@RequestMapping("/api/login")
@Slf4j
@RequiredArgsConstructor
public class LoginResource {

    private final AuthenticationManager authenticationManager;

    ....
}

SecurityConfig:

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig  {

    private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;

    private final JwtRequestFilter jwtRequestFilter;

    private final UserDetailsService jwtUserDetailsService;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // Add a filter to validate the tokens with every request
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public AuthenticationManager authenticationManagerBean(HttpSecurity http) throws Exception {
        AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
        authenticationManagerBuilder.userDetailsService(jwtUserDetailsService).passwordEncoder(passwordEncoder());
        return authenticationManagerBuilder.build();
    }
}

그럼 나한테 잘 먹히네요!!

코드를 아래 섹션으로 바꿉니다.

내 코드에서 잘 작동하기를 바랍니다.

       @Bean
       public AuthenticationManager authenticationManagerBean(HttpSecurity http) throws Exception {
            AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
            authenticationManagerBuilder
                  .userDetailsService(jwtUserDetailsService)
                  .passwordEncoder(passwordEncoder());
            return authenticationManagerBuilder.build();
        }

100% 테스트 완료.시도해 보세요.

@Configuration
@RequiredArgsConstructor // lombok
public class YourConfigClass {
    private final UserDetailsService userService;
    private final AuthenticationConfiguration configuration;

    @Autowired
    void configure(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(userService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }
    @Bean
    AuthenticationManager authenticationManager() throws Exception {
        return configuration.getAuthenticationManager();
    }

    // OR use
    // Remove or comment out: private final AuthenticationConfiguration configuration;
    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
}

언급URL : https://stackoverflow.com/questions/71605941/spring-security-global-authenticationmanager-without-the-websecurityconfigurera

반응형