如何使用Spring Boot和Spring Data Jpa从数据库中获取用户登录



我想用自己数据库中的数据制作登录表单。我制作了实体用户类:

@Entity
@Table(name = "Auth_data")
public class User {
@Id
@GeneratedValue
@Getter @Setter
private Long id;
@Column(name= "username")
@Getter @Setter
private String username;
@Column(name="password")
@Getter @Setter
private String password;
@Enumerated(EnumType.ORDINAL)
@Column(name="role")
@Getter @Setter
private Role role;
@Column(name = "client_ID")
@Getter @Setter
private Long clientID;
@Column(name = "instructor_ID")
@Getter @Setter
private Long instructorID;
public User() {}
public User(String username, String password, Role role, Long clientID, Long instructorID) {
this.username = username;
this.password = password;
this.role = role;
this.clientID = clientID;
this.instructorID = instructorID;
}
}

此外,我还创建了UserDetailsServiceIml类,该类实现UserDetailsService:

@Service
public class UserDetailsServiceIml implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
final User user = userRepository.findByUsername(username);
if(user == null) {
throw new UsernameNotFoundException(username);
}
Set<GrantedAuthority> grantedAuthorities = new HashSet< >();
grantedAuthorities.add(new SimpleGrantedAuthority(user.getRole().name()));
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
grantedAuthorities);
}
}

我的用户存储库类:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}

我还试着把Query做成这样:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("Select u from User u WHERE u.username=:username")
User findByUsername(@Param("username") String username);
}

但当我在登录表单中输入登录名和密码时,我会出错,因为在数据库中搜索后,用户为Null。我该怎么修?

UPD:解决了!我不知道为什么和如何。我发现hibernate创建了新的表";auth_ data";,但没有使用我的桌子";Auth_data";。因此,我将";Auth_ data";至";auth_ data";现在开始工作了!我还在@Data上更改了@Getter@Setter,在";用户findByUsername(字符串用户名("并将字段角色的类型从enum更改为String。

您可能没有将要登录的用户作为数据库种子。如果数据库中不存在用户,则可以使用ApplicationRunner类在每次启动时为其设定种子。此外,您可以在类级别上应用Lombok的@Data注释来为所有字段生成getter和setter。

package com.javahowtos.dataseeddemo.dataseed;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import com.javahowtos.dataseeddemo.model.User;
import com.javahowtos.dataseeddemo.repository.UserRepository;
@Component
public class UserDataLoader implements CommandLineRunner {
@Autowired
UserRepository userRepository;
@Override
public void run(String... args) throws Exception {
loadUserData();
}
private void loadUserData() {
if (userRepository.count() == 0) {
User user1 = new User("John", "Doe");
User user2 = new User("John", "Cook");
userRepository.save(user1);
userRepository.save(user2);
}
System.out.println(userRepository.count());
}
}

来源:https://javahowtos.com/guides/107-spring/376-how-to-seed-the-database-in-spring-boot-project.html

  • 您必须确保数据库中有一个具有适当用户名的用户(区分大小写(,如果没有用户,您可以插入一些测试用户(使用迁移工具、自定义组件或手动(
  • 您可能需要为username添加一个唯一的索引
  • 如果您扩展JpaRepository并添加方法findByUsername,spring将生成实现,并且您不需要@Query,如果您有多个项目,则可以使用findFirstByUsername

最新更新