Các API xác thực như đăng ký, kích hoạt và đăng nhập là 3 API tương đối phức tạp trong các dự án cho phép người dùng đăng nhập. Chúng ta sẽ sử dụng spring boot web, jpa và security để tạo ra 3 API này nhé.

Thiết kế luồng đăng nhập

Một người dùng sẽ trải qua các bước sau để đăng nhập:

  1. Đăng ký: Đây là bước người dùng cung cấp một số thông tin để ghi nhận thông tin của mình vào cơ sở dữ liệu, quan trọng nhất là tên đăng nhập và mật khẩu.
  2. Kích hoạt: Một người dùng khi đăng ký sẽ chưa được sử dụng tài khoản ngay mà cần kích hoạt tài khoản qua đường link được gửi qua email.
  3. Đăng nhập: Sau khi người dùng kích hoạt tài khoản thì họ có thể đăng nhập.

Thiết kế luồng xác thực

Khi người dùng đăng nhập thành công họ sẽ được cấp một access token, khi họ gửi yêu cầu truy cập vào các API được bảo vệ, yêu cầu đó sẽ được trải qua đối tượng đánh chặn Interceptor để xác thực access token, nếu xác thực thành công thì yêu cầu sẽ được chuyển đến controller để xử lý.

Khởi tạo cơ sở dữ liệu

Chúng ta có thể khởi tạo cơ sở dữ liệu có tên login thông qua câu lệnh như sau:

CREATE SCHEMA `login` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

Tiếp theo chúng ta có thể khởi tạo bảng users để lưu thông tin người dùng:

CREATE TABLE IF NOT EXISTS `users` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT,
    `username` varchar(128) COLLATE utf8mb4_unicode_520_ci NOT NULL,
    `email` varchar(120) COLLATE utf8mb4_unicode_520_ci,
    `password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL,
    `display_name` varchar(250) COLLATE utf8mb4_unicode_520_ci,
    `activation_token` varchar(255) COLLATE utf8mb4_unicode_520_ci,
    `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'INACTIVATED',
    PRIMARY KEY (`id`),
    UNIQUE KEY `key_username` (`username`),
    UNIQUE KEY `key_email` (`email`),
    UNIQUE KEY `key_activation_token` (`activation_token`),
    INDEX `index_status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Trong đó:

  1. id: là mã người dùng sẽ được tự tăng.
  2. username: Là tên đăng nhập.
  3. email: Email của người dùng.
  4. password: Mật khẩu của người dùng ở dạng mã hoá.
  5. display_name: Tên đầy đủ của người dùng.
  6. activation_token: Là token sẽ được gửi kèm với đường dẫn kích hoạt cho người dùng qua email.
  7. status: Trạng thái của người dùng, mặc định là chưa kích hoạt.
    Tiếp theo chúng có thể khởi tạo bảng access_tokens để lưu access token của người dùng:
   CREATE TABLE IF NOT EXISTS `access_tokens` (
    `access_token` varchar(256) NOT NULL,
    `user_id` bigint NOT NULL,
    `expired_at` datetime NOT NULL,
    PRIMARY KEY (`access_token`),
    INDEX `index_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
  1. access_token: Là access token của người dùng.
  2. user_id: Là mã người dùng.
  3. expired_at: Là thời điểm mà token hết hạn.

Khởi tạo dự án

Chúng ta sẽ khởi tạo một module có tên spring-boot-login với tập tin pom.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>vn.techmaster</groupId>
        <artifactId>mastering-spring-boot</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>spring-boot-login</artifactId>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-crypto</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>${mysql.version}</version>
        </dependency>
    </dependencies>
</project>

Tổng kết

Như vậy chúng ta đã cùng nhau tạo khởi tạo dự án trong bài tiếp theo chúng ta sẽ thiết kế các gói.


Cám ơn bạn đã quan tâm đến bài viết|video này. Để nhận được thêm các kiến thức bổ ích bạn có thể:

  1. Đọc các bài viết của TechMaster trên facebook: https://www.facebook.com/techmastervn
  2. Xem các video của TechMaster qua Youtube: https://www.youtube.com/@TechMasterVietnam nếu bạn thấy video/bài viết hay bạn có thể theo dõi kênh của TechMaster để nhận được thông báo về các video mới nhất nhé.
  3. Chat với techmaster qua Discord: https://discord.gg/yQjRTFXb7a