项目组实际需要,实现菜单和后台接口的操作权限控制
大概思路如下:
首先是将前段页面上的菜单层级以及系统中所有的后台接口,通过数据库表的方式配置起来,我们项目是按照菜单以及后台接口两种类型权限,菜单类型就是登录后能看到那些菜单(例如:系统管理菜单,人员管理,角色管理等),接口就是当前登录用户具有那些后台的接口权限(例如:保存用户接口、删除用户接口、编辑用户等),将系统中的角色以及权限配置好映射关系表,用户登录系统后,拿到用户信息的同时,也返回用户的菜单,进入操作页面后,进行增删查改操作的时候,统一被拦截器拦截过滤,是否具有真正的操作权限。
本文说明的是系统定时加载最新的系统所有权限到内存中,保证内存中最新的数据,用户登录系统调用接口,拦截器拦截调用,判断权限是否真正有效,这个时候,就会遇到一个问题,系统定时刷新读取数据到内存中,这个时候用户正在操作,正在读取内存数据,存在读写并发问题,这个时候就使用ReadWriteLock上场啦!
@Data
public class Permission {
public static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private static Permission permission = new Permission ();
//权限相关的内存对象
private Map map1= new HashMap<>();
private Map map2= new HashMap<>();
private Map map3= new HashMap<>();
//权限相关的其他对象
//.....
public static Permission getPermission () {
readWriteLock.readLock().lock();
try {
return this.permission ;
} finally {
readWriteLock.readLock().unlock();
}
}
public static synchronized void setPermission (Permission permission ) {
readWriteLock.writeLock().lock();
try {
this.permission= permission ;
} finally {
readWriteLock.writeLock().unlock();
}
}
}
在启动类中执行:
@Component
public class PermissionTask {
/**
* 容器启动1秒后立即执行,权限定时刷新(每10秒执行一次)
*/
@Scheduled(initialDelay = 1000,fixedDelay=10000)
public void run() {
System.out.println("现在时间是:"+new Date());
Permission permission = new Permission();
//各种查询数据库
//...
permission.setMap1(realMap1);//realMap1是查询封装的对象
permission.setMap2(realMap2);//realMap2是查询封装的对象
permission.setMap3(realMap3);//realMap3是查询封装的对象
//权限信息赋值
permission .setPermission (permission );
}
上面是加载操作权限的示例,在权限拦截校验的时候,使用拦截器拦截request请求,获取请求信息,再调用Permission.getPermission 方法获取系统最新的权限配置,判断当前登录用户,是否真的具有目标权限,从而实现权限的校验功能!!!!