簡體   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