IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java基于模块的数据字典权限验证防止数据越权攻击 -> 正文阅读

[Java知识库]java基于模块的数据字典权限验证防止数据越权攻击

允许的数据保存在会话中,属性为"modulePerm",数据结构为Map结构,各个模块的数据相互独立,各个模块的key值不同,比如用户模块就是"sysUser"。

每个模块内,又可以设置多个需要校验的属性,每个属性设置不同的名称。

1. 添加权限数据

void addCheckData(String modueName, String keyName, HashSet hset) {
		// 权限数据
		HashMap permMap = new HashMap<String, HashSet>();

		permMap.put(keyName, hset);

		// 分模块验证数据
		HashMap moduleMap = new HashMap<String, HashMap>();

		// 设置模块
		moduleMap.put(modueName, permMap);

		HttpSession session = ServletUtils.getSession();

		session.setAttribute("modulePerm", moduleMap);

	}

2. 验证数据方法

void verifyCheckData(String modueName, String keyName, ArrayList<String> arrayValue) {
		HttpSession session = ServletUtils.getSession();
		HashMap moduleMap = (HashMap) session.getAttribute("modulePerm");

		// 获取模块需要验证的内容
		HashMap<String, HashSet<String>> map = (HashMap<String, HashSet<String>>) moduleMap.get(modueName);

		if (map != null) {
			for (Map.Entry<String, HashSet<String>> entry : map.entrySet()) {
				String key = entry.getKey();
				HashSet<String> valSet = entry.getValue();

				// 指定了key,只验证指定key,其他key跳过当前验证
				// 空值表示验证所有规则
				if (StringUtils.isNotEmpty(keyName) && !key.equals(keyName)) {
					continue;
				}				
				
				// 这里的id应该在允许的map里面
				for (String str : arrayValue) {

					if (!valSet.contains(str)) {
						// 非法参数
						throw new BusinessException("非法参数");
					}
				}
			}

		}
		else
		{
			// 非法参数
			throw new BusinessException("非法参数");
		}
	}

3. 添加数据

查询权限范围内的数据的同时,将数据保存到会话中。

public class SysUserController extends BaseController {
		
	private String MODULE_NAME = "sysUser";
	private String CHECK_KEY_1 = "roleIds";
	
	public String add(ModelMap mmap) {
		List<SysRole> listRole = roleService.selectRoleAll();

		HashSet hset = new HashSet<String>();

		for (SysRole role : listRole) {
			Long roleId = role.getRoleId();

			hset.add(roleId.toString());
		}

		addCheckData(MODULE_NAME, CHECK_KEY_1, hset);

		mmap.put("roles", listRole);
		mmap.put("posts", postService.selectPostAll());
		return prefix + "/add";
	}	
	
}

4. 执行验证

在执行数据保存的时候,进行参数验证。

public class SysUserController extends BaseController {
		
	private String MODULE_NAME = "sysUser";
	private String CHECK_KEY_1 = "roleIds";
		
	
	public AjaxResult addSave(SysUser user) throws Exception {

		ArrayList arrayList = new ArrayList<String>();
		
		for(Long id : user.getRoleIds())
		{
			arrayList.add(id.toString());
		}
		
		verifyCheckData(MODULE_NAME, CHECK_KEY_1, arrayList);
	}	
}

比如在添加用户操作中,返回的页面之前,需要读取允许添加的用户角色列表,可以将该数据保存到会话中,当保存添加的用户时,就可以根据之前保存的数据校验用户角色是否在允许的范围内,如果不在允许范围内,则可以说明被篡改过,此时不应执行添加用户。

除了添加以外,对于修改用户和删除用户,也可以采用类似思路进行处理。

在实际的项目应用中,可以把添加数据和验证数据的方法添加到父类,这样子类就可以直接调用了,不用在每个子类中添加这两个方法。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 21:56:42  更:2022-03-17 21:58:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:12:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码