Java 如何使用SpringBoot、jpa、hibernate和mysql验证用户登录并传递JWT令牌

Java 如何使用SpringBoot、jpa、hibernate和mysql验证用户登录并传递JWT令牌,java,spring,hibernate,web-services,spring-boot,Java,Spring,Hibernate,Web Services,Spring Boot,我正在使用angular应用程序,该应用程序具有登录表单(用户名和密码)。我必须构建RESTAPI端点,它根据数据库值对Credentail进行身份验证,并将JWT发送回angular客户端。我使用的是SpringBoot、jpa、hibernate和mysql,我不知道如何验证登录Credentails并发回JWT。谁能告诉我该怎么做 UserController.java import java.util.List; import org.sambasoft.entities.User;

我正在使用angular应用程序,该应用程序具有登录表单(用户名和密码)。我必须构建RESTAPI端点,它根据数据库值对Credentail进行身份验证,并将JWT发送回angular客户端。我使用的是SpringBoot、jpa、hibernate和mysql,我不知道如何验证登录Credentails并发回JWT。谁能告诉我该怎么做

UserController.java

import java.util.List;

import org.sambasoft.entities.User;
import org.sambasoft.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
@CrossOrigin(origins="http://localhost:4200", allowedHeaders="*")
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public List<User> getUsers() {
        return userRepository.findAll();
    }

    @GetMapping("/user/{UserID}")
    public User getUser(@PathVariable Integer UserID) {
        return userRepository.findOne(UserID);
    }

    @DeleteMapping("/user/{UserID}")
    public boolean deleteUser(@PathVariable Integer UserID) {
        userRepository.delete(UserID);
        return true;
    }

    @PutMapping("/user")
    public User updateUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @PostMapping("/user")
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
主类

@SpringBootApplication
public class CrudBackendApplication implements CommandLineRunner {
    @Autowired
    private UserRepository userRepository;


    public static void main(String[] args) {
        SpringApplication.run(CrudBackendApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

    }
}

你可以使用spring security!如果这对您有所帮助,您应该使用Spring Security(SprSec),它是在Java应用程序中实现身份验证和授权的主要框架

SprSec提供了一个身份验证框架,该框架支持基于浏览器的基本身份验证或生成的登录表单以及其他身份验证范例(如开放Id连接预身份验证)的用户名/密码。SprSec也是高度可定制的,只要您投入大量时间阅读和学习它的功能

SprSec提供了广泛的自动配置功能,通过发现类路径上配置的库来适应应用程序上下文。从我在代码中看到的情况来看,您可能只需要很少的配置就可以满足您的需求。不过,我建议您使用4.x版本,该版本允许超级添加一些自动配置设置,而版本5将在您创建配置对象(本例中为WebSecurityConfigureAdapter类)后自动删除所有自动配置设置,并让您自行设置整个配置。过一段时间后,你当然可以,但作为一个开始的努力,它可能是相当具有挑战性的

至于JWT,有许多库可用于生成和验证令牌。通过在SprSec SecurityFilterChain中插入servlet过滤器(或者您可以从提供的众多SprSec过滤器中获得),可以轻松地将其功能集成到SprSec身份验证和授权过程中

浏览到

并向下滚动通过JWT调试器。您将发现这样的库的广泛列表(6个java)。我个人喜欢Nimbus jose jwt,因为它提供了优秀的文档,并且对标准进行了广泛的覆盖

总之,我强烈建议您投入时间使用SprSec,因为您的方法是重新发明一个非常非常复杂的车轮,而不是重复使用由知识渊博的专家开发的现有复杂车轮

希望这有帮助


Jake

请阅读Spring的众多教程中的一个,比如。我没有看到针对数据库的用户验证,你能不能请任何示例程序或详细说明要做的事情这最好作为一个注释而不是答案。不能,低代表。抱歉:)好的,在这种情况下,你能用一些参考链接、示例代码等来扩展你的答案吗?然后它可以成为一个正确的答案。
@SpringBootApplication
public class CrudBackendApplication implements CommandLineRunner {
    @Autowired
    private UserRepository userRepository;


    public static void main(String[] args) {
        SpringApplication.run(CrudBackendApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

    }
}