登录 NullPointerException 时 Spring Security 无法访问 userService

Posted

技术标签:

【中文标题】登录 NullPointerException 时 Spring Security 无法访问 userService【英文标题】:Spring security cannot access userService while login NullPointerException 【发布时间】:2021-06-06 20:24:39 【问题描述】:

当发出登录请求时,出现此错误,告诉我 userService 为空。 当我创建 UserService 的对象而不是自动装配它时,它会传递它,但告诉我在 userService 中调用的存储库为空。存储库是自动装配的,我无法实例化它,因为它是一个接口。

这里是服务类:

@Service
public class MyUserDetailsService implements UserDetailsService 
    @Autowired
    UserService userService;

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException 
        return new MyUserDetails(userService.getByUsernameOrEmail(s));
    

这是安全配置类: 另外我正在创建一个 MyUserService 对象,因为 spring 无法自动装配它告诉我没有 bean 有这样的名称。

@Configuration
@EnableWebSecurity
public class UserSercurity extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(new MyUserDetailsService());
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable().authorizeRequests()
                .anyRequest().hasRole(UserType.ADMIN.toString())
                .and().formLogin();
    

    @Bean
    public PasswordEncoder passwordEncoder() 
        return NoOpPasswordEncoder.getInstance();
    

【问题讨论】:

【参考方案1】:

您不能在存储库中实例化方法或变量,因为它是一个接口,但是您可以自动装配存储库类以使用在 userRepository 接口中声明的方法,您必须自动装配存储库类。您可以像我一样这样做在下面的代码中完成。 你的服务类应该是这样的:

@Autowired
private UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
    Users user = userRepository.getUserByUsername(username);
    if (user == null) 
        throw new UsernameNotFoundException("Could not find user");
    
    return new MyUserDetails(user);
 

你的仓库应该是这样的:

@Repository
public interface UserRepository extends JpaRepository<Users, Long> 
  @Query("SELECT u FROM Users u WHERE u.name = ?1")
  public Users getUserByUsername(String username);

并且还在您的配置类中自动装配 UserDetailsS​​ervice 并在您的 configure(AuthenticationManagerBuilder auth) 方法中传递实例 userDetailsS​​ervice,UserDetailsS​​ervice 为您提供 MyUserDetailService 类的实例。

 @EnableWebSecurity
 public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
 @Autowired
 UserDetailsService userDetailsService;

@Bean
public PasswordEncoder getPasswordEncoder() 
    return NoOpPasswordEncoder.getInstance();


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


@Override
protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests()
            .antMatchers("/").permitAll()
            .and()
            .formLogin().permitAll()
            .defaultSuccessUrl("/", true)
            .and()
            .logout().permitAll()
            .logoutSuccessUrl("/");

尝试以这种方式实施,如果这是您问题的解决方案,请告诉我,如果您仍有疑问,请随时提问。

【讨论】:

Intellij 强调 userDetailsS​​ervice 告诉我无法自动注册,没有找到 UserDetailsS​​ervice 的 bean,但应用程序可以编译并且可以运行,谢谢

以上是关于登录 NullPointerException 时 Spring Security 无法访问 userService的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 登录 AsyncTask #4 NullPointerException 启动时崩溃

Android java.lang.NullPointerException:println需要一条消息[重复]

使用 Facebook SDK 和 ParseFacebookUtils 登录时出现 NullPointerException

StandardPasswordEncoder 抛出 NullPointerException : SpringSecurity

JoinTable 注释导致 NullPointerException

尝试将 android 连接到 sql server 时出现 NullPointerException