hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 18: Phân quyền teacher/student và bảo vệ endpoint
Java và Spring Boot – MVC và REST API

Spring Boot bài 18: Phân quyền teacher/student và bảo vệ endpoint

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 8/12: Đăng nhập, phân quyền và bảo vệ request · Bài 18/28 · Biên soạn tháng 10/2026.

← Bài 17 · Mục lục 12 chương · Bài 19 →

Mục lục

  • Mục tiêu bài học
  • Lập bảng quyền trước khi viết matcher
  • Role và authority
  • Ẩn nút chỉ là trải nghiệm giao diện
  • Phân biệt 401, redirect đăng nhập và 403
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Thiết kế quy tắc truy cập theo HTTP method và đường dẫn; kiểm tra quyền tại server thay vì chỉ ẩn nút.

Lập bảng quyền trước khi viết matcher

Khách được xem danh sách và chi tiết khóa học. Teacher được thêm, sửa, xóa và quản lý tài liệu. Student chỉ có quyền như người xem đối với những thao tác này. Bảng quyền đơn giản giúp quyết định matcher chính xác và tạo ca kiểm thử dễ hiểu.

Một URL không phải lúc nào cũng chỉ có một quyền. GET /api/courses có thể công khai, trong khi POST cùng URL cần teacher. Vì vậy rule theo HTTP method phải đặt rõ trước rule tổng quát /api/**. Các matcher được xét theo thứ tự; đặt permitAll quá rộng ở đầu có thể vô tình mở cả thao tác ghi.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/SecurityConfig.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@Bean SecurityFilterChain security(HttpSecurity http,@Qualifier("cors") CorsConfigurationSource corsSource)throws Exception{
    http.authorizeHttpRequests(a->a
        .requestMatchers("/","/css/**","/login","/error","/actuator/health","/api/docs").permitAll()
        .requestMatchers(HttpMethod.GET,"/courses","/courses/*","/api/courses","/api/courses/*").permitAll()
        .requestMatchers("/admin/**","/api/**").hasRole("TEACHER")
        .anyRequest().authenticated())
        .formLogin(f->f.defaultSuccessUrl("/courses",true))
        .httpBasic(withDefaults()).cors(c->c.configurationSource(corsSource))
        .logout(l->l.logoutSuccessUrl("/courses"));
    return http.build();
}

Role và authority

User.withUsername(…).roles("TEACHER") tạo authority có tiền tố ROLE_. hasRole("TEACHER") dùng quy ước đó; không truyền ROLE_TEACHER vào hasRole theo cùng cách rồi nhân đôi tiền tố. Nếu thiết kế authority chi tiết như course:write, dùng hasAuthority với chính tên quyền đó.

Trong mẫu, đường dẫn /admin/** và các API không được công khai yêu cầu teacher. Quy tắc anyRequest().authenticated() giữ những đường dẫn còn lại phải có đăng nhập. Khi bổ sung endpoint mới, đọc lại cả matcher tổng quát để đảm bảo quyền thực tế đúng với ý định.

Ẩn nút chỉ là trải nghiệm giao diện

Người dùng có thể tự gõ URL, sửa HTML hoặc gửi request bằng công cụ khác. Vì vậy dù nút xóa đã bị ẩn, server vẫn phải kiểm tra quyền ở request xóa. Bản mẫu cố ý giữ giao diện đơn giản; các test xác nhận student không thể ghi dữ liệu dù có CSRF token hợp lệ.

Với nghiệp vụ phức tạp, quyền theo URL chưa đủ. Một teacher có thể chỉ được sửa khóa học do mình sở hữu; lúc đó Service cần kiểm tra ownership trên đối tượng cụ thể. Method security với @PreAuthorize là một lựa chọn bổ sung khi bật cấu hình tương ứng. Không nên thêm annotation mà chưa bật hoặc chưa test rồi coi như đã bảo vệ được tầng nghiệp vụ.

Phân biệt 401, redirect đăng nhập và 403

Khi chưa xác thực, ứng dụng web có thể redirect tới /login; client API yêu cầu kiểu JSON hoặc dùng Basic thường nhận challenge 401. Khi đã xác thực nhưng thiếu quyền, kết quả là 403. CSRF thiếu cũng có thể trả 403, nên mã trạng thái một mình chưa chỉ ra toàn bộ nguyên nhân.

Kiểm tra cùng một request theo ba trạng thái: khách, student và teacher. Với request ghi, thêm ca teacher có token hợp lệ và teacher thiếu token. Quan sát status, response và dữ liệu DB sau request. Đây là cách phát hiện rule sai mà một lần bấm nút bằng tài khoản admin không thể cho thấy.

Lỗi thường gặp và lưu ý

  • Rule công khai nên hẹp và có HTTP method rõ ràng khi cùng URL hỗ trợ cả đọc lẫn ghi.
  • CSRF token hợp lệ không cấp quyền teacher cho student.

Ghi nhớ

Quyền phải được server thực thi và được kiểm thử cho cả người được phép lẫn người bị từ chối.

Tài liệu đối chiếu

  • Authorize HTTP Requests

← Bài 17 · Mục lục 12 chương · Bài 19 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài
Java và Spring Boot – MVC và REST API
Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service
Java và Spring Boot – MVC và REST API
Spring Boot bài 14: Quan hệ JPA, DTO và tránh truy vấn N+1
Java và Spring Boot – MVC và REST API
Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát
Java và Spring Boot – MVC và REST API
Spring Boot bài 16: Upload và download tài liệu có giới hạn
Java và Spring Boot – MVC và REST API
Spring Boot bài 17: Spring Security: đăng nhập, mật khẩu và SecurityFilterChain
Java và Spring Boot – MVC và REST API
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách
Java và Spring Boot – MVC và REST API
Spring Boot bài 20: REST Controller, JSON và DTO cho API danh sách
Java và Spring Boot – MVC và REST API
Spring Boot bài 21: REST CRUD: POST, PUT, DELETE và mã trạng thái
Java và Spring Boot – MVC và REST API
Spring Boot bài 22: Validation API, ProblemDetail và hợp đồng lỗi
Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×