【问题标题】:CrudRepository return nullCrudRepository 返回 null
【发布时间】:2021-12-13 18:32:35
【问题描述】:

我找不到问题所在。我正在通过用户名和密码在数据库中搜索用户。但它返回 null。

这是我的存储库:

@Repository
public interface UserCrudRepository extends CrudRepository<User, Integer>{

List<User> findByUsernameAndPassword(String username, String password);}

这是我的服务:

@Service
public class UserService {
@Autowired
private UserCrudRepository crudRepo;


public List<User> findByUsernameAndByPassword(String username, String password){
//List<UserModel> ut=null;
//ut= crudRepo.findByUsernameAndPassword(username, password);
return crudRepo.findByUsernameAndPassword(username, password);
}

当我调试我的应用程序时,我在“findByUsernameAndPassword(username, password);”中看到了用户写的信息是存在的,但是方法返回null。

这里有什么问题?

【问题讨论】:

  • 结果是 null 还是空 List?您的数据库区分大小写吗? ("User1" vs "user1") Reposiory 返回 List,在注释掉的部分我看到 List...
  • crudRepo.findByUsernameAndPassword 内部发生的不是所有有趣的问题吗?
  • 在 crudRepo.findByUsernameAndPassword() 里面只有 Spring 魔法
  • 也许是一个愚蠢的问题,但我猜你已经在你的数据库中编码了密码,你在调用crudRepo.findByUsernameAndPassword(username, password)之前是否也对其进行了编码?
  • @b.GHILAS,这是真的。我正在写一个更完整的答案,包括那个非常重要的细节

标签: java spring crud-repository


【解决方案1】:

由于您已加密密码,因此最好的方法是仅通过 username 搜索用户,然后使用 BCryptPasswordEncoder 将纯文本 password 与数据库中的编码版本匹配。您可以在您的服务中获得BCryptPasswordEncoder,如下所示:

@Service
public class UserService {
  @Autowired
  private BCryptPasswordEncoder bCryptPasswordEncode;

  @Autowired
  private UserCrudRepository crudRepo;

  public List<User> findByUsernameAndByPassword(String username, String password){
    List<User> users = crudRepo.findByUsername(username);
    for (user : users) {
       if (bCryptPasswordEncoder.matches(password, user.getPassword())) {
          // passwords match
       }
    }
  }
}

您还需要有一个配置文件,您要求在其中创建 BCryptPasswordEncoder

public class SecurityConfiguration {
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

您需要调整您的存储库:

@Repository
public interface UserCrudRepository extends CrudRepository<User, Integer>{
  List<User> findByUsername(String username);
}

我假设您将其用作表单操作系统身份验证,因此如果您还没有使用它,您可以考虑查看UserDetailsService 接口 (https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/userdetails/UserDetailsService.html)。

【讨论】:

    【解决方案2】:

    我认为您需要编写一个查询来获取 UserCrudRepository 中的用户详细信息。

    @Query("SELECT u FROM User u WHERE lower(u.username) LIKE %?1% AND " +
          "lower(u.password) LIKE %?2%")
    List<User> findByUsernameAndPassword(String username, String password);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2018-06-01
      • 2019-01-15
      • 1970-01-01
      • 2018-02-04
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多