You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java配置中注入AuthenticationManager?启动报错求助

问题:Spring启动时因缺少AuthenticationManager Bean失败

尝试了相关建议但未解决,特此提问:如何在自定义过滤器中通过Java配置注入AuthenticationManager?Spring启动时提示需要类型为org.springframework.security.authentication.AuthenticationManager的Bean,具体报错信息如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 2 of constructor in com.minul.springjwt.auth.AuthenticationService required a bean of type 'org.springframework.security.authentication.AuthenticationManager' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.security.authentication.AuthenticationManager' in your configuration.

相关代码:

package com.minul.springjwt.auth;

import com.minul.springjwt.config.JwtService;
import com.minul.springjwt.user.Role;
import com.minul.springjwt.user.User;
import com.minul.springjwt.user.UserRepository;
import lombok.RequiredArgsConstructor;

import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AuthenticationService {

    private final UserRepository repository;
    private final PasswordEncoder passwordEncoder;
    private JwtService jwtService;

    private final AuthenticationManager authenticationManager;



    public AuthenticationResponse register(RegisterRequest request) {
        var user = User.builder()
                .firstname(request.getFirstname())
                .lastname(request.getLastname())
                .email(request.getEmail())
                .password(passwordEncoder.encode(request.getPassword()))
                .role(Role.USER)
                .build();
        repository.save(user);
        var jwtToken = jwtService.genarateToken(user);
        return  AuthenticationResponse.builder()
                .token(jwtToken)
                .build();
    }


    public AuthenticationResponse authenticate(AuthenticationRequest request) {
        authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(
                        request.getEmail(),
                        request.getPassword()
                )
        );
        var user = repository.findByEmail(request.getEmail())
                .orElseThrow();
        var jwtToken = jwtService.genarateToken(user);
        return  AuthenticationResponse.builder()
                .token(jwtToken)
                .build();
    }
}

问题分析与解决方法

问题根源

Spring Security默认不会将AuthenticationManager暴露为可注入的Bean,你的AuthenticationService通过@RequiredArgsConstructor自动注入该对象时,Spring容器中找不到对应的Bean实例,因此启动报错。

解决步骤

方案1:基于WebSecurityConfigurerAdapter(适用于Spring Security 5.7之前版本)

创建Spring Security配置类,继承WebSecurityConfigurerAdapter并重写authenticationManagerBean()方法,将其标记为@Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.authentication.AuthenticationManager;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

    // 可在此添加其他安全配置,比如密码编码器、用户认证逻辑等
}

方案2:基于SecurityFilterChain(Spring Security 5.7+推荐方式)

使用组件式配置,通过AuthenticationManagerBuilder构建并暴露AuthenticationManager Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.Configuration;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
@Configuration
public class SecurityConfig {

    private final UserDetailsService userDetailsService;
    private final PasswordEncoder passwordEncoder;

    public SecurityConfig(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) {
        this.userDetailsService = userDetailsService;
        this.passwordEncoder = passwordEncoder;
    }

    @Bean
    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
        AuthenticationManagerBuilder authBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
        // 配置用户认证逻辑,关联自定义UserDetailsService和密码编码器
        authBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
        return authBuilder.build();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // 配置你的安全规则,比如开放授权接口、禁用csrf等
        http.csrf().disable()
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll()
                .anyRequest().authenticated()
            );
        return http.build();
    }
}

额外注意点

你的AuthenticationService中JwtService未添加final修饰符,@RequiredArgsConstructor不会自动注入该对象,运行时会出现空指针异常,需修改为:

private final JwtService jwtService;

内容的提问来源于stack exchange,提问作者minul hemasara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:32:47