Home > html

Hướng Dẫn Tạo Chức Năng Đăng Nhập, Đăng Ký và Phân Quyền (Admin, Manager, Sale, Client) trong Java Spring Boot

Hướng Dẫn Tạo Chức Năng Đăng Nhập, Đăng Ký và Phân Quyền (Admin, Manager, Sale, Client) trong Java Spring Boot

Để triển khai chức năng đăng nhập và đăng ký trong Java Spring Boot, chúng ta sẽ thực hiện các bước sau:

  1. Tạo cơ sở dữ liệu: Bao gồm bảng User để lưu thông tin người dùng, bao gồm tên đăng nhập, mật khẩu và vai trò.
  2. Tạo Entity lớp User: Tạo một lớp User tương ứng với bảng trong cơ sở dữ liệu.
  3. Tạo Repository: Sử dụng Spring Data JPA để thao tác với cơ sở dữ liệu.
  4. Tạo Service: Chứa logic nghiệp vụ cho việc đăng ký và đăng nhập.
  5. Tạo Controller: Xử lý các yêu cầu từ phía người dùng (web).
  6. Bảo mật (Security): Sử dụng Spring Security để bảo mật API và lưu trữ mật khẩu an toàn.

1. Cấu trúc cơ sở dữ liệu

Giả sử chúng ta có một bảng users trong cơ sở dữ liệu với các cột sau:

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role VARCHAR(255) NOT NULL
);

2. Tạo Entity User
package com.example.demo.model;

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

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;
    private String role;

    // Getters and Setters
}
3. Tạo Repository
package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByUsername(String username);
}
4. Tạo Service
Service lớp chứa các nghiệp vụ xử lý đăng ký và đăng nhập người dùng.

Đăng ký người dùng (đăng ký với mật khẩu mã hóa):
package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    public boolean registerUser(String username, String password, String role) {
        // Kiểm tra nếu người dùng đã tồn tại
        Optional<User> existingUser = userRepository.findByUsername(username);
        if (existingUser.isPresent()) {
            return false; // Người dùng đã tồn tại
        }

        // Mã hóa mật khẩu
        String encodedPassword = bCryptPasswordEncoder.encode(password);

        // Tạo người dùng mới và lưu vào cơ sở dữ liệu
        User user = new User();
        user.setUsername(username);
        user.setPassword(encodedPassword);
        user.setRole(role);

        userRepository.save(user);
        return true;
    }

    public Optional<User> loginUser(String username, String password) {
        Optional<User> user = userRepository.findByUsername(username);
        if (user.isPresent() && bCryptPasswordEncoder.matches(password, user.get().getPassword())) {
            return user; // Đăng nhập thành công
        }
        return Optional.empty(); // Đăng nhập thất bại
    }
}
5. Tạo Controller
Controller lớp xử lý các yêu cầu HTTP cho chức năng đăng nhập và đăng ký.
package com.example.demo.controller;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;
import java.util.Optional;

@RestController
@RequestMapping("/auth")
public class AuthController {

    @Autowired
    private UserService userService;

    // Đăng ký người dùng
    @PostMapping("/register")
    public String register(@RequestBody Map<String, String> user) {
        String username = user.get("username");
        String password = user.get("password");
        String role = user.get("role");

        boolean success = userService.registerUser(username, password, role);
        if (success) {
            return "User registered successfully!";
        } else {
            return "User already exists!";
        }
    }

    // Đăng nhập người dùng
    @PostMapping("/login")
    public String login(@RequestBody Map<String, String> credentials) {
        String username = credentials.get("username");
        String password = credentials.get("password");

        Optional<?> user = userService.loginUser(username, password);
        if (user.isPresent()) {
            return "Login successful!";
        } else {
            return "Invalid username or password!";
        }
    }
}
6. Bảo mật với Spring Security
Để bảo mật các API, bạn cần cấu hình Spring Security để mã hóa mật khẩu và bảo vệ các endpoint.

Cấu hình Spring Security
package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/auth/register", "/auth/login").permitAll() // Cho phép đăng ký và đăng nhập
            .anyRequest().authenticated(); // Các yêu cầu khác yêu cầu xác thực
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
7. Thử nghiệm
Khi đã cấu hình xong, bạn có thể sử dụng công cụ như Postman để thử nghiệm các API đăng ký và đăng nhập.

Đăng ký:

URL: POST http://localhost:8080/auth/register
Body (JSON):
{
    "username": "john",
    "password": "password123",
    "role": "USER"
}
Đăng nhập:

URL: POST http://localhost:8080/auth/login
Body (JSON):
{
    "username": "john",
    "password": "password123"
}

bbugtea

bbugtea

Là người yêu thích, tìm hiểu quy trình gia công hệ thống phần mền website. Câu tục ngữ yêu thích nhất: "CÓ CÔNG MÀI SẮT CÓ NGÀY NÊN KIM".

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *