繁体   English   中英

如何使用 Spring 引导和 Spring 数据 Jpa 从数据库获取用户登录

[英]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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM