Đề bài: Một hệ thống lớn có rất nhiều hệ thống nhỏ xung quanh, database lưu trữ người dùng được đặt ở hệ thống chính, nơi chính là hệ thống bán hàng, giờ khi các service con cần xác thực thì lại query vào DB đó khiến lượng người dùng CCU tăng đột biến và gây lag cho toàn bộ hệ thống ?

=> Tách một hệ thống người dùng tập trung nơi và phục vụ duy nhất việc xác thực người dùng.

=> Có một hệ thống phân quyền ở giữa hệ thống người dùng và các service con nhằm đáp ứng nhiệm vụ phân quyền, tránh viết lặp lại các logic nhiều nơi

Lời giải:

Keycloak

--

Đầu tiên, ta tạo ra một realm, vương quốc của những ứng dụng con và người dùng trên ứng dụng đó.

Tạm gọi khai sinh ra realm Hà Nội

Với mỗi ứng dụng nhỏ hơn ta, ra một client, tương ứng với quận, huyện

VD: Quận Hoàn Kiếm, Quận Ba Đình, Huyện Đông Anh, Huyện Đông Em ....

Kéo xuống dưới, bật toggle này lên để có thể truy cập vào tab Authoization từ đó ta có thể xác thực, phân quyền.

Xác thực và phân quyền

Tab đầu tiên là tab cài đặt chung, ở đây ta có thể chú ý đến phần

Policy enforcement mode

=> Chính xác truy cập vào resouce khi thực hiện yêu cầu

Ở đây là có 3 giá trị:

  • Enforcing (mặc định) chỉ truy cập được vào các tài nguyên cho phép tương ứng
  • Permissive tài nguyên đéo gì của client này tao cũng truy cập được
  • Disabled đéo thằng nào vào được tài nguyên của tao

Decision Strategy

Cấp phép truy cập tài nguyên dựa theo tất cả các permisson được đánh giá

Ở đây có 2 giá trị:

  • Affirmative ít nhất thỏa mãn một permission
  • Unanimous là phải thỏa mãn tất cả các permission

Remote Resource Management

Cho phép quản lý, truy cập từ xa (API)

Resource

Resource này là nơi chứa các resource thực sự như ảnh, video, json, ....

Ta tạm hiểu là các Phường nhé. VD: Phường Mai Dịch, Phường Dịch Vọng ...

Tiện đây thì có cả scope nữa

=> Bản chất Scope Resource là ngang hàng với nhau không thằng nào là cha của thằng nào cả. Nhưng thằng Resouce thì lại có thể chứa được thêm các thằng scope, lúc đó ta hiểu là Resouce đang liên kết với scope và ngoài ra thì nó được cái có cung cấp nhiều thông tin hơn và nó có thể có thêm các atrributes để càng làm rõ hơn cho một tài nguyên nào đó.

Policy là chính sách để thực hiện một Permission

Permission là khả năng thực hiện, tác động và resource đó theo policy

Quay trở lại bài toán

Ta coi mỗi ứng dụng là một client

Ta coi mỗi module tính năng là một Resource : Order

Ta coi mỗi loại người dùng là một Scope : Shipper, Customer, Manager

Giờ ta tạo ra danh sách các role và user trước đã

Tương ứng từng user với từng role (role trên của client dong-anh)

Giờ ta tạo ra các Policy sau

Ở đây:

  • Aggregated -> Kết hợp nhiều policy
  • Client -> Check theo client (ứng dụng service con ấy) từ user đấy
  • Client Scope -> Check theo client scope (ứng dụng service con ấy) từ user đấy
  • Group -> Check theo group của user đấy
  • Role-> Check theo role của user đấy
  • Time-> Check theo time của request đấy
  • User-> Check ttheo user đấy

Ở đây là các policy và kết hợp các policy. Tất cả các policy đều trả về kiểu bool với giá trị true hoặc flase.

Ở đây ta đã có các permission rồi và việc xác thực đã được thực hiện, khi trả về bearer token giả mã ra đã chứa các permisson đáp ứng.

Ngoài ra ta chú ý đến những giá trị như này của policy và permisson:

  • Affirmative đúng ít nhất một policy là có được permission đó
  • Unanimous đúng toàn bộ
  • Consensus là đúng nhiều hơn sai

Và giờ chúng ta tận hưởng thôi.

Tham khảo

https://stackoverflow.com/questions/42186537/resources-scopes-permissions-and-policies-in-keycloak