Как аутентифицировать логин пользователя и передать токен JWT с помощью Spring boot, jpa, hibernate и mysql - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над угловым приложением, которое имеет форму входа (имя пользователя и пароль). Мне нужно создать конечную точку REST APi, которая проверяет подлинность учетных данных по значениям базы данных и отправляет обратно JWT угловому клиенту. Я использую весеннюю загрузку, jpa, hibernate и mysql, и я не уверен, как аутентифицировать crendentails входа и отправить обратно 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);
    }

User.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "UserID", nullable = false, unique = true)
    private Integer UserID;

    private String Username;
    private String Password;

    public Integer getUserID() {
        return UserID;
    }

    public void setUserID(Integer userID) {
        UserID = userID;
    }

    public User(String Username, String Password)
    {
        this.Username = Username;
        this.Password = Password;       
    }

    public 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 {

    }
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы должны использовать Spring Security (SprSec), который является основной платформой для реализации аутентификации и авторизации в вашем приложении Java.

SprSec предоставляет инфраструктуру аутентификации, которая поддерживает имя пользователя / пароль с помощью BasicAuthentication на основе браузера или с помощью сгенерированной формы входа в систему, а также с другой парадигмой аутентификации, такой как предварительная аутентификация Open Id Connect. SprSec также легко настраивается при условии, что вы потратите значительное количество времени на чтение и изучение его возможностей.

SprSec предлагает широкие возможности автоконфигурации, которые адаптируются к контексту вашего приложения путем обнаружения настроенных библиотек на вашем пути к классам. Из того, что я вижу из вашего кода, вы, вероятно, сможете удовлетворить ваши потребности с небольшим количеством настроек. Однако я бы посоветовал вам использовать версию 4.x, которая позволяет заменить некоторые параметры автоконфигурации, в то время как версия 5 автоматически удалит все параметры автоконфигурации, как только вы создадите объект конфигурации (в данном случае класс WebSecurityConfigurerAdapter), и оставит вам настраивать весь shebang. Через некоторое время вы, безусловно, сможете, но для начала это может быть довольно сложным делом.

https://spring.io/guides/topicals/spring-security-architecture/

https://docs.spring.io/spring-security/site/docs/5.0.3.RELEASE/reference/html5/

Что касается JWT, есть много библиотек, которые вы можете использовать для генерации и проверки токенов. Их возможности могут быть легко интегрированы в процесс аутентификации и авторизации SprSec путем вставки фильтров сервлета в SprSec SecurityFilterChain (или вы можете получить из одного из множества предоставляемых фильтров SprSec).

Просмотр https://jwt.io/ ...

и прокрутите вниз мимо отладчика JWT. Вы найдете обширный список таких библиотек (6 в Java). Я лично одобряю Nimbus-jose-jwt за отличную документацию и широкое освещение стандарта.

В заключение я настоятельно рекомендую вам потратить время на использование SprSec, поскольку ваш подход заключается в том, чтобы заново изобрести очень, очень сложное колесо, а не использовать существующее сложное колесо, разработанное высококвалифицированными специалистами.

Надеюсь, это поможет.

Джейк

0 голосов
/ 04 мая 2018

Вы можете использовать весеннюю безопасность! если это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...