[英]How to get User from database for login with Spring Boot and Spring Data Jpa
我想用我自己的数据库中的数据制作登录表单。 我创建了实体用户 class:
@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;
}
}
我还制作了实现 UserDetailsService 的 UserDetailsServiceIml class:
@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);
}
}
我的用户存储库 class:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
我也尝试过这样的查询:
@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。 我该如何解决?
更新:已解决。 我不知道为什么以及如何,我发现 hibernate 创建了新表“auth_data”。 但没有使用我的表“Auth_data”,所以,我将“Auth_data”重命名为“auth_data”,现在它可以工作了; 我还在“用户 findByUsername(String username);”上的用户存储库中更改了 @Data.changed 上的 @Getter @Setter 并将字段角色的类型从枚举更改为字符串。
您可能没有使用您尝试登录的用户为数据库播种。 如果用户在数据库中不存在,您可以使用 Application Runner class 在每次启动时为其播种。 此外,您可以在 class 级别应用来自 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.