### 獲取當前登錄用戶
```java
// 注入工具類
@Autowired
private SecurityUtil securityUtil;
// 獲取當前登錄用戶【部分數據,從內存即線程線程變量中獲取數據,推薦使用】
// 包含id、username、nickname、mobile、email、departmentId、type、permissions(角色和菜單名)
User user = securityUtil.getCurrUserSimple();
// 獲取當前登錄用戶【完整數據,調用SQL和Redis緩存查詢】
User user = securityUtil.getCurrUser();
```
### 數據權限
- 獲取當前用戶數據權限(可訪問的部門ID),返回List<String>,null代表具有所有權限
```java
// 注入工具類
@Autowired
private SecurityUtil securityUtil;
// 獲取當前用戶數據權限
List<String> ids = securityUtil.getDeparmentIds;
// 獲取是否僅自己數據權限
Boolean isSelfDataPerm = securityUtil.isSelfDataPerm();
```
- 需自行根據在業務邏輯層或DAO層進行過濾使用,原理即使用SQL中的`in`語句
- JPA示例一
```java
@Override
public Page<User> findByCondition(User user, Pageable pageable) {
return userDao.findAll(new Specification<User>() {
@Nullable
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
Path<String> departmentIdField = root.get("departmentId");
List<Predicate> list = new ArrayList<Predicate>();
// 數據權限過濾
List<String> depIds = securityUtil.getDeparmentIds();
if(depIds!=null&&depIds.size()>0){
list.add(departmentIdField.in(depIds));
}
Predicate[] arr = new Predicate[list.size()];
cq.where(list.toArray(arr));
return null;
}
}, pageable);
}
```
- JPA示例二
```java
// DAO層
public interface UserDao extends XbootBaseDao<User, String> {
List<User> findByDepartmentIdIn(List<String> departmentIds);
}
// 業務邏輯層
...
@Autowired
private UserDao userDao;
// 數據權限過濾
userDao.findByDepartmentIdIn(securityUtil.getDeparmentIds());
...
```
- Mybatis-Plus示例
```java
...
QueryWrapper<User> qw = new QueryWrapper<User>();
// 數據權限過濾
qw.in("department_id", securityUtil.getDeparmentIds());
IPage<User> data = iUserService.page(PageUtil.initMpPage(page), qw);
...
```
### 自定義多維度IP、uid限流示例
```java
// 注入
@Autowired
private RedisRaterLimiter redisRaterLimiter;
// IP限流 1秒限1個請求
String token = redisRaterLimiter.acquireToken(ip, 1, 1000);
if (StrUtil.isBlank(token)) {
throw new XbootException("你手速怎么這么快,請點慢一點");
}
```
### 分布式同步鎖
```java
// 注入
@Autowired
private RedisLockTemplate redisLockTemplate;
redisLockTemplate.execute("訂單流水號", 3, TimeUnit.SECONDS, new Callback() {
@Override
public Object onGetLock() throws InterruptedException {
// TODO 獲得鎖后要做的事
log.info("生成訂單流水號");
return null;
}
@Override
public Object onTimeout() throws InterruptedException {
// TODO 未獲取到鎖(獲取鎖超時)后要做的事
log.info("oops 沒拿到鎖");
return null;
}
});
```
### Redis使用scan命令替換keys
- `keys`命令效率極低,屬于`O(N)`操作,會阻塞其他命令,在集群上會是災難性的操作。XBoot框架`common`包中已提供基于`scan`操作封裝的方法,詳見`RedisTemplateHelper`
```java
// 注入
@Autowired
private RedisTemplateHelper redisTemplateHelper;
// 方式一 先獲取滿足表達式的key 然后刪除
Set<String> keys = redisTemplateHelper.scan("key::*");
redisTemplateHelper.delete(keys);
// 方式二 直接通過表達式刪除所有key
redisTemplate.deleteByPattern("key::*");
```
### 第三方工具類庫包`Hutool`
> 已包含大量實用工具類,建議收藏仔細閱讀,詳見官方文檔 [https://www.hutool.cn/docs/#/](https://www.hutool.cn/docs/#/)
#### Xss攻擊過濾
- Vue中使用`v-html`或富文本編輯器時需根據業務需求后端過濾Xss攻擊,調用hutool提供的方法即可
```java
HtmlUtil.fiter("要過濾的內容")
```
- 前言&版本說明
- 概念
- XBoot 是什么?
- 系統架構
- 主要使用的開源組件
- 角色控制訪問權限(RBAC)
- 用戶手冊
- 系統配置
- 工作流使用配置
- 定時任務調度
- 智能助手客服機器人
- 項目本地運行
- 后端運行
- 前端運行
- 項目結構說明
- 附:使用Oracle等數據庫
- 模塊化版本
- 后端開發指南
- 基本開發指南
- 前后端數據交互標準
- 工具類及數據權限
- 代碼生成器-30秒搞定CRUD
- 增刪改查CRUD
- 日志類型注解擴展
- 邏輯刪除
- 各驗證碼使用及配置
- 接口文檔使用及認證
- 前端開發指南
- 基本開發指南
- 主題/Logo/首頁等配置
- 路由菜單配置
- 多語言國際化配置
- 自定義圖標icon
- 工具類及數據獲取
- 其他說明
- 完整版開發指南
- 前端Vue代碼生成器
- Activiti工作流
- 單點登錄配置
- 智能助手/客服機器人
- MinIO對象存儲服務搭建
- 第三方社交賬號配置
- 短信開發/站內消息/郵件
- Vaptcha驗證碼
- 禁用詞使用
- 前端移除CDN
- 其他說明
- 開放平臺及單點登錄
- 開放平臺使用指南
- Web接入開發流程
- 單點登錄開發指南
- 微信小程序端開發指南
- 項目導入與開發必讀
- 業務組件
- 產品組件(小)
- 產品組件(大)
- 優惠券組件
- 評論列表組件
- 紅包組件
- 推薦商品組件
- 頁面設計
- 商品詳情頁及SKU設計
- 通用方法工具類說明
- 開發經驗與踩坑分享
- Uniapp端開發指南
- APP后端開發指南
- Uniapp前端開發指南
- 開發新功能示例
- 后端開發新模塊
- 前端開發新頁面
- 測試
- SonarQube代碼質量管理
- TestNG單元測試
- ExtentReports測試報告
- Selenuim自動化Web測試
- Appuim自動化App測試
- JMeter壓測性能測試
- 部署
- Spring Boot配置
- 快速部署
- 后端部署
- 前端部署
- 前端部署優化
- Docker容器化部署
- 服務器配置
- 持續集成
- GitLab
- GitLab CI
- XBoot 腳本參考
- Jenkins
- Jenkins安裝
- XBoot CI參考
- DevOps環境搭建
- 組件安裝列表
- 開發設計規范
- 分支管理
- 數據庫設計規范
- Redis使用規范
- Java基礎開發規范
- Rest API規范
- 項目結構規范
- 前端開發規范
- 前端設計規范
- 項目搭建分享
- 后端相關
- SpringBoot 2.x區別總結
- Spring Security整合JWT
- Spring Security動態權限管理
- Spring Boot 2.x整合Quartz
- Spring Boot 2.x整合Websocket
- Spring Boot 2.x整合Activiti工作流以及模型設計器
- Spring Boot + Security全局跨域配置
- 前端相關
- axios請求封裝 統一異常處理
- 動態路由菜單加載
- 多維度控制權限至按鈕顯示
- 發送消息圖標紅點實時顯示
- 動態組件單頁操作
- XBoot助你【告別996】
- 業務開發踩坑
- 你會用開發神器IDEA嗎
- Lombok你知道多少
- 你還在手動校驗參數嗎
- 你真的會用JPA嗎
- Lamda表達式
- Stream流式API
- 告別資源關閉
- Optional避免null
- 谷歌Guava工具包
- 線程池
- 其他小經驗技巧
- 更新日志及步驟
- 常見問題