Spring Data JPA查询返回null

3

我的项目基于Spring Boot、Thymeleaf、MySQL、HTML和JQuery。

我编写了一个查询来检查用户名和密码是否有效,如果有效则返回TRUE,否则返回false。这是我的场景。但它传递了null,因此它成为了null指针异常。以下是我的代码:

public interface RepoUserSignup extends JpaRepository<EntUserSignup, Integer> 
{

    @Query("SELECT pk FROM EntUserSignup pk WHERE pk.username=:uname AND pk.password=:pwd")
    Boolean checkUsername(@Param("uname") String username,@Param("pwd") String password);


}

请帮忙,谢谢提前。

这里是一些关于IT技术的内容。

你的意思是什么,但它传递了空值? - Youcef LAIDANI
1
您的查询选择了类型为EntUserSignuppk。这不是布尔值,而是一个EntUserSignup对象。如果没有这样的EntUserSignup对象,则查询返回null。这是预期的行为。 - JB Nizet
哦,我忘记了那个。。 - Vignesh R
请注意这意味着您在数据库中以明文形式存储密码,而不是进行加盐哈希处理。不要这样做。 - JB Nizet
我不明白...什么是“加盐哈希”?@JB - Vignesh R
请参考https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet。这是加密相关的内容。哈希将密码应用单向不可逆函数转换为其他内容,盐值是在哈希之前完成的,通过将随机字符串附加到密码上来防止字典攻击,即对常见单词进行哈希并将结果与存储的哈希进行比较。要验证密码,您需要使用相同的盐值,然后对给定的密码进行哈希,并将结果与存储的值进行比较。 - JB Nizet
3个回答

2

请使用以下方法替换您的方法:

Optional<EntUserSignup> findByUsernameAndPassword(String username, String password);

然后在您的业务层中,您可以这样做:
EntUserSignup user = findByUsernameAndPassword(username, password)
                     .orElseThrow(() -> new UsernameNotFoundException("User not found!"));

当然,不要忘记明文密码的问题...


一个好的教程如何在Spring Boot应用程序中实现安全性...


2

您的查询返回的是一个对象而不是布尔值,因此有两种方法:

  • 您的方法应该返回EntUserSignup checkUsername(@Param("uname") String username, @Param("pwd") String password);,然后检查是否有结果。
  • 另一种方法是检查结果的数量@Query("SELECT COUNT(pk) > 0 FROM EntUserSignup pk WHERE pk.username=:uname AND pk.password=:pwd"),如果有结果,则COUNT(pk) > 0将返回true,否则返回false。

哎呀,还有其他的检查方法吗? - Vignesh R
为什么你不想要这种方式,@VigneshR? - Youcef LAIDANI
1
没什么,只是为了增加知识...了解其他的方法...:=) - Vignesh R

1
我只是改变了我的返回类型。
@Query("SELECT pk FROM EntUserSignup pk WHERE pk.username=:uname AND pk.password=:pwd")
    EntUserSignup checkUsername(@Param("uname") String username,@Param("pwd") String password);

当传递的用户名和密码匹配时,它将返回实体值,否则为null。因此,我们可以确定没有匹配的用户名和密码。然后,我们可以编写以下逻辑:
@Service
public Boolean doCheckUserLogin(EntUserSignup user) {
        Boolean result = false;
        try {
            EntUserSignup entResult = repoSignup.checkUsername(user.getUsername(),user.getPassword());
            if(entResult!=null)
            {
                result = true;
            }
            else
            {
                result = false;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            result = false;
        }
        return result;
    }

这个逻辑运行得非常完美……

3
一行代码:return findByUsernameAndPassword(username, password).isPresent(); - Cepr0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接