1. Giới thiệu
Chào mừng các bạn đến với phần đầu tiên của series hướng dẫn sử dụng Spring Security 6 kết hợp với JWT và Oauth2. Bài viết này sẽ mở rộng kiến thức từ bài viết trước về cách cấu hình bảo mật cho Spring Boot 3 (nếu bạn chưa đọc, có thể tìm hiểu tại đây: Spring Boot 3 và Spring Security 6). Chúng ta sẽ đi sâu vào việc triển khai các giải pháp bảo mật quan trọng mà bạn sẽ tiếp xúc trong thực tế. Cuối bài, mình cũng sẽ giới thiệu về KeyCloak, một công cụ hữu ích trong việc quản lý danh tính và quyền truy cập.
Link đến series: Spring Security 6 với JWT và Oauth2
2. Thiết lập môi trường phát triển
Trong bài viết đầu tiên này, chúng ta sẽ xây dựng một Project REST API với các API cơ bản phục vụ cho mục đích bảo mật. Dưới đây là thông tin chi tiết về project cũng như các dependency cần thiết:
Lưu ý: Để giảm độ phức tạp và đảm bảo rằng các API hoạt động chính xác, chúng ta sẽ không thêm các dependency bảo mật vào project ngay lập tức. Chúng ta sẽ thực hiện điều này ở phần sau.
Cấu hình application.properties
Chúng ta cần cấu hình file application.properties
để kết nối đến MySQL:
spring.application.name=spring-security
spring.datasource.url=jdbc:mysql://localhost:3306/spring_security
spring.datasource.username=sc
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
3. Tạo các REST API
3.1. Tạo Entity
Để tương tác với MySQL, chúng ta cần tạo các Entity. Dưới đây là class User trong package entity:
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
private String username;
private String password;
private String firstName;
private String lastName;
private String email;
}
3.2. Tạo Repository
Chúng ta sẽ tạo interface UserRepository mở rộng từ JpaRepository
để tương tác với database:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
3.3. Tạo Service
Tiếp theo, hãy định nghĩa interface UserService với các method cần thiết:
public interface UserService {
User createUser(User user);
List<User> getUsers();
User getUserById(Long userId);
User updateUser(Long userId, User user);
}
Chúng ta sẽ triển khai interface này trong class UserServiceImpl:
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Override
public User createUser(User user) {
return userRepository.save(user);
}
@Override
public List<User> getUsers() {
return userRepository.findAll();
}
@Override
public User getUserById(Long userId) {
return userRepository.findById(userId).orElse(null);
}
@Override
public User updateUser(Long userId, User user) {
User existingUser = userRepository.findById(userId).orElse(null);
if (existingUser != null) {
existingUser.setUsername(user.getUsername());
existingUser.setEmail(user.getEmail());
existingUser.setFirstName(user.getFirstName());
existingUser.setLastName(user.getLastName());
return userRepository.save(existingUser);
}
return null;
}
}
3.4. Tạo Controller
Cuối cùng, chúng ta tạo class UserController nằm trong package controller để xử lý các yêu cầu từ client:
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserServiceImpl userService;
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return ResponseEntity.ok(createdUser);
}
@GetMapping
public ResponseEntity<List<User>> getUsers() {
List<User> users = userService.getUsers();
return ResponseEntity.ok(users);
}
@GetMapping("/{userId}")
public ResponseEntity<User> getUser(@PathVariable Long userId) {
User user = userService.getUserById(userId);
return ResponseEntity.ok(user);
}
@PutMapping("/{userId}")
public ResponseEntity<User> updateUser(@PathVariable Long userId, @RequestBody User user) {
User updatedUser = userService.updateUser(userId, user);
return ResponseEntity.ok(updatedUser);
}
}
4. Kiểm Tra API Bằng Postman
Dưới đây là dữ liệu mẫu để test API:
{
"username": "john_doe",
"password": "SecurePass123!",
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@example.com"
}
5. Kết Luận
Trên đây là hướng dẫn xây dựng project REST API cơ bản. Trong phần tiếp theo, chúng ta sẽ bổ sung các tính năng bảo mật vào project này. Mã nguồn dự án có thể được tìm thấy tại đây: GitHub - spring-security
Hy vọng bài viết sẽ hữu ích cho các bạn trong quá trình học tập và làm việc với Spring Security!
source: viblo