thảo luận Triển khai microservice cho backend springboot

  • Người tạo chủ đề Người tạo chủ đề Hero Kun
  • Ngày bắt đầu Ngày bắt đầu
thank 2 fens, thực ra chỗ này nếu OK thì tạo 1 con redis key = ID user, value = token để lưu jwt, mỗi lần check thì check có trong redis không đã nếu làm thủ công nhỉ.
Mình nghĩ k đc đâu :v làm như fen thì giả sử cái token trong redis nó expire và mình vẫn xài token đó bắn lên server thì sao :v vẫn pass à :v spring security nó có behavior khác, nó bắn cái jwt lên authentication server để validate cái jwt đó, nó bao gồm cả việc token expire
 
Mình nghĩ k đc đâu :v làm như fen thì giả sử cái token trong redis nó expire và mình vẫn xài token đó bắn lên server thì sao :v vẫn pass à :v spring security nó có behavior khác, nó bắn cái jwt lên authentication server để validate cái jwt đó, nó bao gồm cả việc token expire
Thấy việc này có gì khó đâu nhỉ ? cứ mỗi lần authen jwt xong nếu pass thì gọi xuống lấy thông tin status của user, nếu disable thì trả lỗi thôi, status của user có thể lưu trên redis là xong mà
 
hồi em làm đồ án thì có 1 service auth gen jwt, ở zuul gateway sẽ implement spring security, secret key truyền public/private key, các serivce sẽ gọi internal bằng service name của k8s, không dùng eureka. còn h theo e biết thì cũng có thể dùng kong gateway và sử dụng jwt plugin có sẵn, hoặc có thể viết custom plugin để thay thế( cái này hơi khoai), giờ làm ops nên k biết có thêm có kiểu nào nữa k :big_smile:
 
Thấy việc này có gì khó đâu nhỉ ? cứ mỗi lần authen jwt xong nếu pass thì gọi xuống lấy thông tin status của user, nếu disable thì trả lỗi thôi, status của user có thể lưu trên redis là xong mà
Theo e hiểu thì theo ý thím kia là lưu cái token vô redis để auth :D còn cái thím nói là pass đc cái token r chạy tiếp business khác define trong hệ thống r :D
 
Đúng r thím, hồi làm cty trước a architecture phân ra cái cấu trúc mình thấy khá hay. Chia ra 2 cục: user vs identity, cục user chuyên quản lý user details, cục identity thì chuyên về role và giao tiếp với keycloak. Nên full flow sẽ là từ client -> user service -> identity service -> keycloak :D
Bác ơi, em tìm hiểu thì để tạo user bằng keycloak thì cần phải có token của thăng admin. vậy một người dùng bất kì không thể đăng kí mới được tài khoản hả bác.
 
Bác ơi, em tìm hiểu thì để tạo user bằng keycloak thì cần phải có token của thăng admin. vậy một người dùng bất kì không thể đăng kí mới được tài khoản hả bác.
vô keycloak copy cái secure key của cái realm đó ra :D nằm chỗ nào mình quên bà nó r :sweat: thím search keyword này thử nè: KeycloakBuilder java
 
k thím, tên nick là đọc one piece thấy skill của 1 char phản diện nghe kêu quá nên bắt chước = ))))))))))))))))))
Bác ơi cho em hỏi chút, em mới viết được cái api(springboot) để đăng kí hoặc đăng nhập thằng keyCloack. có các nàò mà lúc đăng kí thành công thì client nó nhận được token ko bác nhỉ.
 
Quan tâm, cơ mà cho mình hỏi trước mình cũng mày mọ dự án cá nhân spring boot microservice như thế này, nhưng mà thất bại do hơi mất time mà đang còn nhiều thứ khác quan trọng hơn. Với lại mình cảm giác như mình đang bị hiểu sai một vấn đề gì đó. Mình triển khai như sau:
  • Sử dụng Spring Authorization Server implement 1 cái Auth-server đóng vai OAuth2 server
  • Gateway: dùng Spring Cloud Gateway implement 1 cái gateway, đóng vai trò là OAuth2 client. Khúc này cũng hơi hắc não xíu do gateway nó dùng Web Reactive.
  • Các microservice đứng sau đóng vai trò là OAuth2 resources.

Khi request gọi tới gateway, nếu nó chưa được xác thực sẽ được chuyển hướng qua Auth-server, xác thực xong sẽ có quyền gọi vào các service. Toàn bộ các quá trình này đều diễn ra ở Gateway. Đại loại trông nó giống như đăng nhập bằng Google vậy.
Nhưng mà mình cứ cảm giác nó cấn cấn cái gì đó nên nếu có gì hiểu sai mong anh em chỉ giáo thêm =((
 
Quan tâm, cơ mà cho mình hỏi trước mình cũng mày mọ dự án cá nhân spring boot microservice như thế này, nhưng mà thất bại do hơi mất time mà đang còn nhiều thứ khác quan trọng hơn. Với lại mình cảm giác như mình đang bị hiểu sai một vấn đề gì đó. Mình triển khai như sau:
  • Sử dụng Spring Authorization Server implement 1 cái Auth-server đóng vai OAuth2 server
  • Gateway: dùng Spring Cloud Gateway implement 1 cái gateway, đóng vai trò là OAuth2 client. Khúc này cũng hơi hắc não xíu do gateway nó dùng Web Reactive.
  • Các microservice đứng sau đóng vai trò là OAuth2 resources.

Khi request gọi tới gateway, nếu nó chưa được xác thực sẽ được chuyển hướng qua Auth-server, xác thực xong sẽ có quyền gọi vào các service. Toàn bộ các quá trình này đều diễn ra ở Gateway. Đại loại trông nó giống như đăng nhập bằng Google vậy.
Nhưng mà mình cứ cảm giác nó cấn cấn cái gì đó nên nếu có gì hiểu sai mong anh em chỉ giáo thêm =((
Bạn làm đúng rồi không sai đâu, thiết kế thì nó không có đúng-sai trắng-đen chỉ là phù hợp hay không phù hợp.

Bài toán AuthN/AuthZ trong hệ thống SOA/Microservices nói chung là bài toán phức tạp phụ thuộc business nên ko có thiết kế nào là chuẩn, nó phụ thuộc vào business nhưng mà có vài yếu tố ntn bạn có thể nghiền ngẫm thế nào cho phù hợp:

1. Stateless, stateful hay hybrid access_token?
Stateless thì dùng các format như JWT, PASETO... bên trong có thể embed claims, permissions... để phục vụ AuthZ nhưng ngộ nhỡ permissions quá nhiều thì sao?

Stateful thì dùng một opaque string nào đó unique/random/secure để làm access_token, cách này thì có vẻ an toàn hơn nhưng đòi hỏi OAuth Server (OS) phải có introspection endpoints để client query thêm thông tin, tăng workloaf cho OS.

Hybrid thì kết hợp bên ngoài là stateful bên trong là stateless, đi qua gateway nó sẽ translate stateful token -> stateless token.

2. Impl AuthN/AuthZ checker ở đâu?
Thường thì khi bạn đọc tài liệu trên mạng thì hay thấy người ta đặt checker ở gateway, cách này thì dễ quản lý tập trung nhưng mà có những logic đòi hỏi granular hơn thì lại ko làm dc. Đòi hỏi phải impl thêm phía services.

3. AuthN/AuthZ model
Chỗ này thì lại càng phức tạp phải cân nhắc với business. Vd ông business đòi hỏi phải impl RBAC level 1/2 gì đấy cho hệ thống thì phải làm sao?
 
Bác ơi cho em hỏi chút, em mới viết được cái api(springboot) để đăng kí hoặc đăng nhập thằng keyCloack. có các nàò mà lúc đăng kí thành công thì client nó nhận được token ko bác nhỉ.
Thường thì business nó phải redirect ra trang login chứ
 
Thường thì business nó phải redirect ra trang login chứ
vâng ạ. việc tạo ra trang đăng nhập ko có gì khó khăn ạ. em đang gặp cái vấn đề là khi đăng kí thành công tài khoản thì Keycloak trả về cho springboot là thông tin user nhưng ko chưa token. Hiện cái project của em thì có 2 chat-service và social-service cần sử dụng id của user. em có hai cách giải quyết như này ạ.
1.vì vậy sau khi tạo thành công user thì em lại call api sang api của chat-service và social-service
=> cần token của Keycloak trả vể=> có thể gọi api lấy token về nhưng hơi dài.
2. Dùng kafka bắn sang => em muốn thử nhưng lại mất nhiều time và máy chạy nhiều chậm máy

Nếu lúc tạo thành công tài khoản nhận luôn token thì bắn id sang chat-service và social-service.
 
vâng ạ. việc tạo ra trang đăng nhập ko có gì khó khăn ạ. em đang gặp cái vấn đề là khi đăng kí thành công tài khoản thì Keycloak trả về cho springboot là thông tin user nhưng ko chưa token. Hiện cái project của em thì có 2 chat-service và social-service cần sử dụng id của user. em có hai cách giải quyết như này ạ.
1.vì vậy sau khi tạo thành công user thì em lại call api sang api của chat-service và social-service
=> cần token của Keycloak trả vể=> có thể gọi api lấy token về nhưng hơi dài.
2. Dùng kafka bắn sang => em muốn thử nhưng lại mất nhiều time và máy chạy nhiều chậm máy

Nếu lúc tạo thành công tài khoản nhận luôn token thì bắn id sang chat-service và social-service.
Mình chịu :D mà thử xài message queue cũng đc, rabbitmq cho nhẹ
 
- auth với websocket thì mình thấy cũng đơn giản à. Lúc connect thì emit 1 event auth. Thằng này gọi sang API Gateway(kraken, kong) để auth ->
Nói chung mô hình microservice thì API Gateway để xử lý auth là bắt buộc rồi
 
- auth với websocket thì mình thấy cũng đơn giản à. Lúc connect thì emit 1 event auth. Thằng này gọi sang API Gateway(kraken, kong) để auth ->
Nói chung mô hình microservice thì API Gateway để xử lý auth là bắt buộc rồi
ah bác cho em hỏi chút, hiện tại em đang làm stompsocket và hiện tại em đang làm.
khi client bắt đầu khởi tạo kết nối socket nó gửi token lên để thằng server nó xác thực và server sẽ trả lại id kết nối, chỉ cần gửi token một lần duy nhất. những lần sau truyền nhận tin nhắn thì em ko gửi token lên nữa chỉ gửi nội dung tin nhắn và id kết nối.
Vậy ổn ko bác nhỉ.
 

Thống kê chủ đề

Ngày tạo
Hero Kun,
Người trả lời cuối
thieugiatri4492,
Trả lời
146
Lượt xem
17.523
Quay lại
Lên đầu trang