读者福利
更多笔记分享
这个项目中就大量使用了 AOP 思想。简单举两个例子吧!
日志记录
====
利用 AOP 方式记录日志,只需要在 controller 的方法上使用 @Log(“”) 注解,就可以将用户操作记录到数据库,源码可查看 eladmin-logging这个 Module。。
@Log(“新增用户”)
@PostMapping(value = “/users”)
public ResponseEntity create(@Validated @RequestBody User resources){
checkLevel(resources);
return new ResponseEntity(userService.create(resources),HttpStatus.CREATED);
}
Redis 限流
========
利用 AOP 方式对接口进行限流,只需要在 controller 的方法上使用@Limit(“”) 注解即可,源码可查看 eladmin-common这个 Module。
/**
* 测试限流注解,下面配置说明该接口 60秒内最多只能访问 10次,保存到redis的键名为 limit_test,
*/
@AnonymousGetMapping
@ApiOperation(“测试”)
@Limit(key = “test”, period = 60, count = 10, name = “testLimit”, prefix = “limit”)
public int test() {
return ATOMIC_INTEGER.incrementAndGet();
}
基于 RBAC 的权限模块设计
===============
系统权限控制采用 RBAC 基于角色的权限访问控制(Role-Based Access Control) 思想(一种最常见的权限管理思想,在一些对于全权限控制要求比较严格的系统会使用到)。
什么是 RBAC 呢?
简单地说:一个用户可以拥有若干角色,每一个角色有可以被分配若干权限这样,就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系,如下图
RBAC
在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。
本系统的权限设计相关的表如下(一共 5 张表,2 张用户建立表之间的联系):
通过这个权限模型,我们可以创建不同的角色并为不同的角色分配不同的权限范围(菜单)。
自定义权限验证方式
=========
Spring Security 提供了Spring EL表达式,允许我们在定义接口的方法上面添加注解来实现权限控制。比如下面的接口表示用户拥有 admin、menu:edit 权限中的任意一个就能能访问update接口。
但是,由于每个接口都需要给超级管理员放行,所以单纯使用这种注解的方式每次都需要重复的添加 admin 权限、
因此我们可以加入自定义权限验证方式,在验证的时候默认给拥有 admin 权限的用户放行。
源码:
// eladmin-common -> me.zhengjie.config.ElPermissionConfig
@Service(value = “el”)
public class ElPermissionConfig {
public Boolean check(String …permissions){
// 获取当前用户的所有权限
List elPermissions = SecurityUtils.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
// 判断当前用户的所有权限是否包含接口上定义的权限
return elPermissions.contains(“admin”) || Arrays.stream(permissions).anyMatch(elPermissions::contains);
}
}
使用方式:
@ApiOperation(“查询任务执行日志”)
@GetMapping(value = “/logs”)
@PreAuthorize(“@el.check(‘timing:list’)”)
public ResponseEntity queryJobLog(JobQueryCriteria criteria, Pageable pageable){
return new ResponseEntity<>(quartzJobService.queryAllLog(criteria,pageable), HttpStatus.OK);
}
对应的数据库内容如下:
审计功能
====
在这个项目中,继承了 BaseEntity 的类会自动写入创建时间、修改时间、创建人、更新人这些数据。
简单介绍一下上面涉及到的一些注解:
-
@CreationTimestamp : 创建对象的时候自动生成时间戳。
-
@UpdateTimestamp:创建对象的时候自动生成时间戳。
-
@CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候会设置值,@LastModifiedBy同理。
最后
我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。
转存中…(img-jnA6ngvl-1715225557837)]