为了账号安全,请及时绑定邮箱和手机立即绑定

AuthenticationManager 在我的自定义过滤器中为空

AuthenticationManager 在我的自定义过滤器中为空

达令说 2023-05-24 14:39:02
我基于UsernamePasswordAuthenticationFilter需要的自定义过滤器,AuthenticationManager但每次我调用该方法时,attemptAuthentication()编译都会在这里失败:Authentication auth2 = this.getAuthenticationManager().authenticate(authRequest);为AuthenticationManager空:java.lang.NullPointerException: null    at app.shellx.security.CustomUsernamePasswordAuthenticationFilter.attemptAuthentication(CustomUsernamePasswordAuthenticationFilter.java:75) ~[classes/:na]Web安全配置@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(securedEnabled = true)public class WebSecurityConfig extends WebSecurityConfigurerAdapter {    @Autowired    UserService userService;    @Autowired    private JwtTokenFilter jwtTokenFilter;    @Autowired    private CustomAuthenticationSuccessHandler customAuthenticationSuccessHandler;    @Override    protected void configure(HttpSecurity http) throws Exception {        http            .httpBasic().disable()            .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class)            .sessionManagement()            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)                .and()            .cors().and()            .csrf().disable()            .authorizeRequests() // .antMatchers("/**")                .antMatchers("/login/**", "/register/**").permitAll()                .antMatchers("/admin/**").hasRole("ADMIN")                      .anyRequest().authenticated()                .and()            //.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());            .addFilterAt(new CustomUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)              .formLogin()                .loginPage("http://localhost:4200/login")//.failureUrl("/login-error")                .loginProcessingUrl("/login")                 .usernameParameter("email")                .successHandler(customAuthenticationSuccessHandler)                .and()            .logout()                 .permitAll();    }    
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

CustomUsernamePasswordAuthenticationFilter不是由 Spring 管理的(因为您直接创建了它),因此您的过滤器中没有 Spring 管理的依赖项注入行为。这就是为什么AuthenticationManager从未注入并且现在为空的原因。

假设你把你的AuthenticationManager作为一个豆子暴露出来......

  1. 您可以通过您的方法使您的过滤器成为一个 bean(注意在 Spring Boot 中自动注册Filterbean)@BeanWebSecurityConfig

  2. 或者您可以在创建过滤器对象时简单地将 传递给AuthenticationManager您的过滤器(通过其构造函数或设置器)。没有必要将过滤器公开为 bean。


查看完整回答
反对 回复 2023-05-24
  • 1 回答
  • 0 关注
  • 373 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信