### 获取当前登录用户
```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工具包
- 线程池
- 其他小经验技巧
- 更新日志及步骤
- 常见问题