一直也沒用過Jeecg Boot的多租戶,沒敢用,最近恰好扒到了相關(guān)的代碼,就捋一下邏輯,為以后使用及調(diào)試做準(zhǔn)備。
以下根據(jù)代碼分析Jeecg Boot多租戶的實現(xiàn)邏輯
1.用戶登錄
用戶登錄后,后端會查出登錄用戶的租戶ID(可多個),整理為租戶ID集合與用戶信息一同返回給前端

image.png
2.前端收到返回信息
前端收到返回信息,取出租戶ID集合,
如果有多個租戶ID讓用戶手動選擇一個當(dāng)前租戶,
如果沒有租戶ID則默認(rèn)值0,
使用"saveTenant"方法將租戶ID設(shè)置到header上,之后發(fā)送請求時header都會帶租戶ID

image.png
3.后端接收請求時
后端接收請求時會用JwtFilter攔截請求,在preHandle()方法中取出請求header中的租戶ID,并設(shè)置到TenantContext對象中

image.png
4.jeecg使用mybatis plus的多租戶插件實現(xiàn)多租戶數(shù)據(jù)隔離
在MybatisPlusSaasConfig配置類里設(shè)置了TenantLineInnerInterceptor攔截器,里面會根據(jù)配置判斷哪些數(shù)據(jù)表需要走租戶過濾,如果需要走租戶過濾,mybatis plus 會在執(zhí)行sql前拼接租戶ID=租戶ID的過濾條件,會從TenantContext中取出當(dāng)前用戶的租戶ID。
TenantLineInnerInterceptor攔截器除了在查詢時會自動過濾租戶ID實現(xiàn)數(shù)據(jù)隔離外,插入數(shù)據(jù)時也會自動設(shè)置租戶ID,這塊沒測試但應(yīng)該是這樣

image.png

image.png