Spring Security 身份验证管理器+数据库

crcmnpdw  于 2023-01-26  发布在  Spring
关注(0)|答案(1)|浏览(152)

我正试图使用Spring Boot Security在我的Spring Boot应用程序上设置一个身份验证系统,但我在让它与我的数据库一起工作时遇到了麻烦。
如果我尝试使用在InMemoryUserDetailsManager中创建的用户凭据登录,AuthenticationManager可以完全正常工作(如果凭据错误,则会抛出错误)。
但是,如果我尝试使用数据库中某个用户的凭据,它不起作用,因为它似乎没有使用AuthenticationManager登录。我是spring boot和spring security的新手,如果我的问题有点愚蠢,请原谅。下面是我的代码,可能有助于您理解我的问题:

@Bean
    public InMemoryUserDetailsManager inMemoryUserDetailsManager(){
        return new InMemoryUserDetailsManager(
                User.withUsername("user1").password(passwordEncoder.encode("1234")).authorities("USER").build(),
                User.withUsername("user2").password(passwordEncoder.encode("1234")).authorities("USER").build(),
                User.withUsername("admin").password(passwordEncoder.encode("1234")).authorities("USER","ADMIN").build()
        );
    }

    @Bean
    public AuthenticationManager authenticationManager(UserDetailsService userDetailsService){
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setPasswordEncoder(passwordEncoder);
        authProvider.setUserDetailsService(userDetailsService);
        return new ProviderManager(authProvider);
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .csrf(csrf ->csrf.disable())
                .authorizeHttpRequests(auth->auth.requestMatchers("/auth/**").permitAll())
                .authorizeHttpRequests(auth ->
                                auth.anyRequest().authenticated()
                )
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
                .httpBasic(Customizer.withDefaults())
                .build();
    }
@PostMapping("/login")
    public Map<String,String> Login(@RequestBody User user){

        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(user.getEmail(), user.getPassword())
        );

我的数据库配置正确,并且包含用户

hs1rzwqc

hs1rzwqc1#

对于可能和我处于相同情况的人,你必须在代码中添加以下内容:

@Bean
    public UserDetailsService userDetailsService(){
        return  email->userRepository.findByEmail(email).orElseThrow(()->new UsernameNotFoundException("User not found"));
    }

此外,您必须按如下方式更改您的authenticationManager:

@Bean
    public AuthenticationManager authenticationManager(){
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setPasswordEncoder(passwordEncoder);
        authProvider.setUserDetailsService(userDetailsService());
        return new ProviderManager(authProvider);
    }

相关问题