Java全栈开发---Java ERP系统开发:商业ERP(十六)Redis缓存系统

一、Shiro细颗粒授权控制

我们前面做的权限控制都是建立在对URL的访问控制,我们把它称之为粗颗粒的访问控制。

我们还可以使用shiro的细颗粒授权控制。

细颗粒授权控制包括:方法级别 与 代码级别

1、方法级别控制

对某个方法加访问控制,用户必须拥有某项权限才可以访问该方法,没有权限则抛出异常,无法访问。

1)开启注解

a、在applicationContext_shiro.xml中添加

在这里插入图片描述

<!-- 启动shiro注解 -->
	<bean
		class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
			depends-on="lifecycleBeanPostProcessor" >
		<!-- 默认使用JDK代理 ,如被代理类没有实现接口,必须使用下列配置开启 cglib代理  -->
		<property name="proxyTargetClass" value="true" />
	</bean>	
	<bean
class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager" />
	</bean>
	<!-- 对安全管理器 增强代码 , spring 后处理器 -->
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> 
b、修改OrdersBiz的doCheck和doStart

在这里插入图片描述

c、修改OrdersBiz的doCheck和doStart

在这里插入图片描述
在这里插入图片描述

d、修改OrdersAction的doCheck

在这里插入图片描述

e、修改OrdersBiz的add方法

在这里插入图片描述

Subject subject = SecurityUtils.getSubject();
		//采购订单申请
		if(Orders.TYPE_IN.equals(orders.getType())) {
    
    
			//代码级别的权限控制
			//判断当前登录的用户是否有采购订单申请的权限
			if(!subject.isPermitted("采购订单申请")) {
    
    
				throw new ErpException("权限不足");
			}
		}else if(Orders.TYPE_OUT.equals(orders.getType())) {
    
    
			if(!subject.isPermitted("销售订单录入")) {
    
    
				throw new ErpException("权限不足");
			}
		}else {
    
    
			throw new ErpException("非法参数");
		}

二、Redis入门

1、需求分析

我们在添加shiro框架后,每次执行功能都会调用授权方法,而每次调用都会执行很多查询,这样会影响效率。这么提升程序性能?我们可以考虑使用缓存数据库来实现。

2、Redis简介

Redis是一个高性能的key-value缓存系统。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起来很好的补充作用。它提供了Java, C++, C#, PHP, JavaScript, Perl, Object-C, pathon, Ruby, Erlang等客户端,使用很方便

3、Redis入门

安装
Windows无需安装,解压后即可使用

(1)启动服务

双击redis-server.exe即可启动服务

(2)连接Redis

进入到reids-server.exe的上当下,在Dos提示符下输入命令,即可连接本地的Redis
在这里插入图片描述
如果是连接远程的Redis,则输入如下命令
在这里插入图片描述
此时表示连接成功

(3)常用命令
1)Set 键值:存值
2)Get 键:取值
3)Del 键:删除值

在这里插入图片描述

三、Redis提升软件的性能

1、在erp_partent当中添加依赖

在这里插入图片描述

2、配置Redis,在erp_biz当中的resources创建applicationContext_jedis.xml文件

在这里插入图片描述

<bean id="jedis" class="redis.clients.jedis.Jedis"  >
     		<constructor-arg index="0" value="127.0.0.1" > </constructor-arg>
</bean>

3、修改EmpBizy以及getMenusByEmpuuid方法

(1)注入Jedis

在这里插入图片描述
在这里插入图片描述

(2)修改getMenusByEmpuuid方法

在这里插入图片描述

@Override
	public List<Menu> getMenusByEmpuuid(Long uuid) {
    
    
		// 1、尝试着从缓存当中去出menuList
		String menuListJson = jedis.get("menuList_"+uuid);
		List<Menu> menuList = null;
		if (menuListJson != null) {
    
    
			System.out.println("从缓存当中取出menuList");
			//3、缓存当中已经存在,取出后再转换成为List对象
			menuList = JSON.parseArray(menuListJson, Menu.class);
		} else {
    
    
			System.out.println("从数据库当中查询出menuList");
			// 第一次查询
			// 2.Jedis不支持对象的存储,支持字符串的存储,所以当第一次存入缓存的时候,就要转换成为JSON字符串存入
			menuList = empDao.getMenusByEmpuuid(uuid);
			jedis.set("menuList_"+uuid, JSON.toJSONString(menuList));
		}
		// return empDao.getMenusByEmpuuid(uuid);
		return menuList;
	}

4、修改用户角色的时候清除缓存

修改EmpBiz当中的updateEmpRoles方法
在这里插入图片描述

// 更新用户角色
	public void updateEmpRoles(Long uuid, String checkedStr) {
    
    
		Emp emp = empDao.get(uuid);
		// 清空该用户下的所有角色
		emp.setRoles(new ArrayList<Role>());
		String[] ids = checkedStr.split(",");
		Role role = null;
		for (String id : ids) {
    
    
			role = roleDao.get(Long.valueOf(id));
			// 设置用户的角色
			emp.getRoles().add(role);
		}
		//清除缓存
		try {
    
    
			//清除缓存中当前用户的菜单权限
			jedis.del("menuList_" + uuid);
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}

5、修改角色权限的时候清除缓存

(1)修改erp_entity下的Role

在这里插入图片描述

@JSONField(serialize=false)
	private List<Emp> emps;//属于这个角色下的用户集合,@JSONField(serialize=false)阻止JSON序列化

	public List<Emp> getEmps() {
    
    
		return emps;
	}

	public void setEmps(List<Emp> emps) {
    
    
		this.emps = emps;
	}
(2)修改role.hbm.xml

在这里插入图片描述

<!-- 反查角色下有哪些用户,这些用户都拥有这个角色 -->
		<bag name="emps" order-by="empuuid" table="emp_role" >
			<key column="roleuuid"></key>
			<many-to-many class="com.itzheng.erp.entity.Emp" column="empuuid" ></many-to-many>
		</bag>
(3)修改RoleBiz

在这里插入图片描述
在这里插入图片描述

		//1、通过角色反差属于这个角色的有哪些用户
		List<Emp> empList = role.getEmps();
		//2、清除这些用户的菜单权限缓存
		try {
    
    
			for (Emp emp :empList) {
    
    
				//清除每个用户菜单权限缓存
				jedis.del("menuList_" + emp.getUuid());
				
			}
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
(4)修改applicationContext_biz.xml

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/112535928