读写锁 ReadWriteLock实现权限控制

项目组实际需要,实现菜单和后台接口的操作权限控制
大概思路如下:
首先是将前段页面上的菜单层级以及系统中所有的后台接口,通过数据库表的方式配置起来,我们项目是按照菜单以及后台接口两种类型权限,菜单类型就是登录后能看到那些菜单(例如:系统管理菜单,人员管理,角色管理等),接口就是当前登录用户具有那些后台的接口权限(例如:保存用户接口、删除用户接口、编辑用户等),将系统中的角色以及权限配置好映射关系表,用户登录系统后,拿到用户信息的同时,也返回用户的菜单,进入操作页面后,进行增删查改操作的时候,统一被拦截器拦截过滤,是否具有真正的操作权限。
本文说明的是系统定时加载最新的系统所有权限到内存中,保证内存中最新的数据,用户登录系统调用接口,拦截器拦截调用,判断权限是否真正有效,这个时候,就会遇到一个问题,系统定时刷新读取数据到内存中,这个时候用户正在操作,正在读取内存数据,存在读写并发问题,这个时候就使用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 方法获取系统最新的权限配置,判断当前登录用户,是否真的具有目标权限,从而实现权限的校验功能!!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值