0

我找不到哪里有问题。我正在通过用户名和密码在数据库中搜索用户。但它返回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。

这里有什么问题?

4

2 回答 2

2

由于您已经加密了密码,因此最好的方法是仅搜索用户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/UserDetailsS​​ervice.html)如果您还没有使用它。

于 2021-10-28T15:28:34.100 回答
0

我认为您需要编写一个查询来获取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);
于 2021-10-28T15:33:12.823 回答