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 17: Spring Security: đăng nhập, mật khẩu và SecurityFilterChain
Java và Spring Boot – MVC và REST API

Spring Boot bài 17: Spring Security: đăng nhập, mật khẩu và SecurityFilterChain

  • 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 17/28 · Biên soạn tháng 10/2026.

← Bài 16 · Mục lục 12 chương · Bài 18 →

Mục lục

  • Mục tiêu bài học
  • Security làm việc trước Controller
  • PasswordEncoder không phải mã hóa để giải mã lại
  • Form login và logout
  • Kiểm tra phiên và lỗi đăng nhập
  • 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

Cấu hình Security bằng bean hiện hành, chạy đăng nhập form và hiểu cách lưu mật khẩu một chiều.

Security làm việc trước Controller

Spring Security dùng chuỗi filter để xử lý xác thực, phiên đăng nhập và kiểm soát truy cập trước khi request đi vào Controller. Khi thêm starter Security, một số đường dẫn có thể bị yêu cầu đăng nhập. Đây là hành vi mặc định cần hiểu và cấu hình có chủ đích, không phải lỗi MVC.

Giáo trình dùng SecurityFilterChain bean và lambda DSL. Không kế thừa WebSecurityConfigurerAdapter theo các bài cũ. Các phiên bản Security được Boot quản lý; không tự ghim một bản Security cũ để một class đã bị loại bỏ xuất hiện trở lại.

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 PasswordEncoder encoder(){return new BCryptPasswordEncoder();}
@Bean UserDetailsService users(PasswordEncoder encoder,AppSettings settings){
    String encoded=encoder.encode(settings.demoPassword());
    return new InMemoryUserDetailsManager(User.withUsername("teacher").password(encoded).roles("TEACHER").build(),User.withUsername("student").password(encoded).roles("STUDENT").build());
}

PasswordEncoder không phải mã hóa để giải mã lại

BCryptPasswordEncoder tạo hash có salt; khi đăng nhập, hệ thống so khớp mật khẩu nhập với hash. Không lưu mật khẩu thô và không cố giải mã hash để hiển thị lại cho người quản trị. Đổi mật khẩu nghĩa là tạo hash mới, không chỉnh chuỗi hash bằng tay.

InMemoryUserDetailsManager tạo teacher và student để học luồng bảo mật. Hai tài khoản dùng mật khẩu từ biến môi trường HVC_DEMO_PASSWORD và được hash khi khởi động. Người dùng này không được lưu vào bảng riêng, không có đăng ký hay khôi phục mật khẩu; triển khai tài khoản thật cần kho người dùng và chính sách vòng đời phù hợp.

Form login và logout

formLogin dùng trang đăng nhập mặc định của Spring Security; nhập username/password rồi server tạo trạng thái authentication phù hợp. Với đăng nhập thành công, mẫu chuyển đến /courses. Logout mặc định xử lý POST với CSRF token; fragment menu dùng form thay vì link GET.

HTTP Basic được bật để thuận tiện kiểm tra API ở các bài sau. Nó gửi thông tin xác thực theo mỗi request phù hợp và phải đi qua HTTPS ngoài máy cục bộ. Base64 trong Basic không phải mã hóa bảo mật. Với sản phẩm có API cho ứng dụng độc lập, cần lựa chọn mô hình xác thực, OAuth2/OIDC hoặc token đúng nhu cầu, thay vì tự viết JWT từ đầu trong khóa cơ bản.

Kiểm tra phiên và lỗi đăng nhập

Mở /login, đăng nhập teacher rồi vào /admin/courses/new. Đăng xuất, thử student và so sánh quyền ở bài sau. Mật khẩu sai không nên tiết lộ tài khoản có tồn tại hay không. Kiểm thử login trong bộ mẫu dùng chính PasswordEncoder và UserDetailsService, còn các test quyền có thể tạo authentication giả để chạy nhanh.

Khi thay mật khẩu demo trong môi trường, khởi động lại ứng dụng để bean người dùng được tạo lại. Không ghi mật khẩu vào log để xác nhận cấu hình. Cookie session cần thuộc tính và HTTPS phù hợp khi triển khai; mẫu chạy localhost chưa thay thế cấu hình bảo mật vận hành.

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

  • Không dùng {noop} hoặc lưu mật khẩu thô vì nghĩ đây chỉ là admin nội bộ.
  • Không nhầm Authentication (là ai) với Authorization (được phép làm gì).

Ghi nhớ

SecurityFilterChain định nghĩa hành vi web; PasswordEncoder xử lý hash; kho người dùng demo chỉ phục vụ học và kiểm thử.

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

  • Username/password authentication
  • Password Storage

← Bài 16 · Mục lục 12 chương · Bài 18 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
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 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
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu

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
×