JeeSite数据权限控制解决方案

2023-11-13

支持如下数据范围设置:

 

  1. 所有数据
  2. 所在公司及以下数据
  3. 所在公司数据
  4. 所在部门及以下数据
  5. 所在部门数据
  6. 仅本人数据
  7. 按明细设置(特殊情况下,跨机构授权)
User user = UserUtils.getUser();
// 使用标准查询
DetachedCriteria dc = articleDao.createDetachedCriteria();
dc.createAlias("office", "office").createAlias("user", "user");
dc.add(dataScopeFilter(user, "office", "user"));
List<Entity> list = articleDao.find(page, dc);;
// 使用HQL查询
String hql = "select e from Entity e join e.office o join e.user u where 1=1 ";
hql += dataScopeFilterString(UserUtils.getUser(), "o", "u");
List<Entity> list2 = articleDao.find(page, hql);

 

	/**
	 * 数据范围过滤
	 * @param dc Hibernate标准查询对象
	 * @param user 当前用户对象,通过“UserUtils.getUser()”获取
	 * @param officeAlias 机构表别名,例如:dc.createAlias("office", "office");
	 * @param userAlias 用户表别名,传递空,忽略此参数
	 * @return 标准连接条件对象
	 */
	protected static Junction dataScopeFilter(User user, String officeAlias, String userAlias) {

		// 进行权限过滤,多个角色权限范围之间为或者关系。
		List<String> dataScope = Lists.newArrayList();
		Junction junction = Restrictions.disjunction();
		
		// 超级管理员,跳过权限过滤
		if (!user.isAdmin()){
			for (Role r : user.getRoleList()){
				if (!dataScope.contains(r.getDataScope()) && StringUtils.isNotBlank(officeAlias)){
					boolean isDataScopeAll = false;
					if (Role.DATA_SCOPE_ALL.equals(r.getDataScope())){
						isDataScopeAll = true;
					}
					else if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(r.getDataScope())){
						junction.add(Restrictions.eq(officeAlias+".id", user.getCompany().getId()));
						junction.add(Restrictions.like(officeAlias+".parentIds", user.getCompany().getParentIds()+user.getCompany().getId()+",%"));
					}
					else if (Role.DATA_SCOPE_COMPANY.equals(r.getDataScope())){
						junction.add(Restrictions.eq(officeAlias+".id", user.getCompany().getId()));
						junction.add(Restrictions.and(Restrictions.eq(officeAlias+".parent.id", user.getCompany().getId()),
								Restrictions.eq(officeAlias+".type", "2"))); // 包括本公司下的部门
					}
					else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(r.getDataScope())){
						junction.add(Restrictions.eq(officeAlias+".id", user.getOffice().getId()));
						junction.add(Restrictions.like(officeAlias+".parentIds", user.getOffice().getParentIds()+user.getOffice().getId()+",%"));
					}
					else if (Role.DATA_SCOPE_OFFICE.equals(r.getDataScope())){
						junction.add(Restrictions.eq(officeAlias+".id", user.getOffice().getId()));
					}
					else if (Role.DATA_SCOPE_CUSTOM.equals(r.getDataScope())){
						junction.add(Restrictions.in(officeAlias+".id", r.getOfficeIdList()));
					}
					//else if (Role.DATA_SCOPE_SELF.equals(r.getDataScope())){
					if (!isDataScopeAll){
						if (StringUtils.isNotBlank(userAlias)){
							junction.add(Restrictions.eq(userAlias+".id", user.getId()));
						}else {
							junction.add(Restrictions.isNull(officeAlias+".id"));
						}
					}else{
						// 如果包含全部权限,则去掉之前添加的所有条件,并跳出循环。
						junction = Restrictions.disjunction();
						break;
					}
					dataScope.add(r.getDataScope());
				}
			}
		}
		return junction;
	}
	
	/**
	 * 数据范围过滤
	 * @param user 当前用户对象,通过“UserUtils.getUser()”获取
	 * @param officeAlias 机构表别名,例如:dc.createAlias("office", "office");
	 * @param userAlias 用户表别名,传递空,忽略此参数
	 * @return ql查询字符串
	 */
	protected static String dataScopeFilterString(User user, String officeAlias, String userAlias) {
		Junction junction = dataScopeFilter(user, officeAlias, userAlias);
		Iterator<Criterion> it = junction.conditions().iterator();
		StringBuilder ql = new StringBuilder();
		ql.append(" and (");
		if (it.hasNext()){
			ql.append(it.next());
		}
		String[] strField = {".parentIds like ", ".type="}; // 需要给字段增加“单引号”的字段。
		while (it.hasNext()) {
			ql.append(" or (");
			String s = it.next().toString();
			for(String field : strField){
				s = s.replaceAll(field + "(\\w.*)", field + "'$1'");
			}
			ql.append(s).append(")");
		}
		ql.append(")");
		return ql.toString();
	}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JeeSite数据权限控制解决方案 的相关文章

  • jeesite mysql_Jeesite框架mysql数据库初始报错

    INFO Scanning for projects WARNING WARNING Some problems were encountered while building the effective model for com thi
  • jeesite中的ztree应用

    话不多说 xff0c 直接开始一二三 jeesite页面上通过以自定义jstl lt sys treeselect gt 方式引入树形选择 1 lt sys treeselect id 61 34 company 34 name 61 34
  • GitHub 优秀的 Android 开源项目和框架

    GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理 精品 博客分类 Android 开源集合 本文章已收录于 Git 原文地址为http www trine
  • TOGAF10®标准中文版--(阶段C —数据架构阶段B )方法

    6 5 方法 6 5 1 数据结构 数据架构应该能够处理 静态数据 存储中的数据 动态数据 事务或服务 API 中的数据 使用中的数据 应用边界的数据 例如 GUI 开放数据 组织提供给公众使用并且自愿或合法要求提供的数据 将添加处理这些类
  • 浏览器辅助神器:油猴脚本使用教程

    油猴脚本 是一段脚本代码 通过它可以让浏览器实现各种各样的扩展功能 和浏览器扩展的作用类似 比如获去链接重定向 微博页面精简 去广告等 相当于给浏览器开了个挂 可以说是浏览器的辅助神器了 相信很多用户都是通过度盘下载脚本认识它的 但它的功能
  • Android开源项目

    一 一个类似微信的时光轴效果 项目地址 https github com ljtyzhr TimeLine 二 安卓选择器类库 包括日期 时间 单项 双项选择器 城市地址选择器 项目地址 https github com gzu liyuj
  • 20个基于SpringBoot搭建的开源项目,总有一个你会感兴趣

    前言 SpringBoot一直是开发者比较青睐的一款轻量级框架 他不仅继承了Spring框架原有的优秀特性 而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程 现在很多Java系的软件开发都是基于SpringBoot的 这
  • 开源项目选型考虑的四个方面

    http www trinea cn other open source choice
  • 若依登录界面美化

    效果图如下 代码如下
  • Jeesite框架实用 查询当前用户拥有权限

    http 127 0 0 1 8980 js a authInfo
  • 让Redis突破内存大小的限制

    Redis虽然可以实现持久化存储 也是基于数据内存模型的基础之上 单机内存大小限制着Redis存储的数据量 有没有一种替代方案呢 本文介绍一款笔者使用的采用New BSD License 许可协议的软件 SSDB 官网地址 http ssd
  • 微信小程序wx.getLocation审核不通过的解决方法

    写这篇文字的同时 博主已经被小程序接口审核拒了12次了 几乎每次都是 1 你好 你的小程序 xxxxxx 申请的wx getLocation接口因你提供的申请原因 辅助图片 网页 视频内容无法确认申请接口使用场景审核不通过 建议修改后重新提
  • TOGAF9.2第I部分 第2章核心概念

    本章提供的核心概念适用TOGAF标准 2 1 什么是TOGAF标准 TOGAF标准是一个架构框架 它提供了协助接受 生产 使用和维护企业架构的方法和工具 它基于支持最佳实践和可重用的现有架构资产集的迭代过程模型 2 2 TOGAF标准中的架
  • 开源项目-CRM客户关系管理系统

    哈喽 大家好 今天给大家带来一个开源系统 CRM客户关系管理系统 主要功能包括客户管理 客户流失 销售机会 客户关怀等模块 系统开发环境以及版本 操作系统 Windows 7 集成开发工具 Eclipse EE 4 7 编译环境 JDK 1
  • GitHub 上排名前 100 的 Objective-C 项目简介

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介 方便初学者快速了解到当前 Objective C 在 GitHub 的情况 GitHub 地址 https github com Aufree trip to iOS blo
  • electron-egg: 新一代桌面应用开发框架

    当前桌面软件技术有哪些 语言 技术 优点 缺点 C wpf 专业的桌面软件技术 功能强大 学习成本高 Java swing javaFx 跨平台和语言流行 GUI库少 界面不美观 C Qt 跨平台 功能和类库丰富 学习成本高 Swift 无
  • jeesite实战(四)——用户权限

    系列文章目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 例如 第一章 Python 机器学习入门之pandas的使用 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一
  • GitHub 上最火的开源项目 —— Java 篇

    很多开发者在看到自己感兴趣的项目时会使用 Star 功能 可以说 Star 的数量在一定程度上代表了开源项目的热门程度 本文整理了 Java 语言中 star 数最多的十五款开源项目 这些项目在 GitHub 上的 star 数均超过 15
  • 5分钟带你看懂Jeesite10大功能要点

    jeesite内容丰富 集成了大量优秀的组件 是一个值得研究的框架 它有 1 shiro安全权限控制 2 mybatis查询缓存接口扩展 3 ecache分布式缓存整合 4 页面资源缓存优化 5 多数据源灵活切换 6 mybatismapp
  • 开源音频处理代码 speex

    Speex 是一套主要针对语音的开源免费 无专利保护的音频 压缩格式 speex是近年来开发出的一套功能强大的语音引擎 能够实现高质量和低 比特率 的编码 它不仅提供了基于码激励线性预测 CELP 算法的编 解码模块 而且在其最新发布的版本

随机推荐

  • Docker数据持久化

    v 持久化 三种 默认的 volumes 占用一部分宿主机的资源 最常用的方式 bind mounts 不同的数据结构不通不可移植 不能写在dockerfile中 比较常用 tmpfs 挂载到内存当中 一般都不会用 docker run i
  • 调研-笔记-基于生成对抗网络的恶意域名训练数据生成

    DGA 域名字符生成模型 域名字符分析 问题 理论上 GAN 中的生成器和判别器部分采用任意可微函数都能表示 因此其主要用于连续数据的处理 如图像生成 视频检测等 13 基于文本的离散数据处理一直是深度神经网络研究的难点之一 本文基于字符串
  • 有源低通滤波器设计

    本文主要记录本人最近项目使用的低通滤波器 对滤波器性能要求是 通频带内增益约11dB 对22HZ以上的频率尽可能滤除 特别是50HZ的工频信号 要求衰减到 50dB或更小 由于巴特沃斯滤波器的特点是通频带的频率响应曲线最平滑 所以选择了巴特
  • WPF--关于控件输入数值验证

    1 XAML代码
  • 开发一个APP多少钱?

    开发一个APP多少钱 开发一个APP要多少钱 相信不光是客户有这个疑问 就算是一般的程序员也想知道答案 很多程序员想在业余时间接外包挣外快 但是他们常常不知道该如何定价 如何有说服力的要价 这是因为没有一套好的计算APP开发成本的方法 由于
  • 浅析ms17_010(永恒之蓝)漏洞利用过程及防护措施

    一 永恒之蓝 Wannacry 漏洞简介 1 一种 蠕虫式 的勒索病毒软件 利用windows的SMB漏洞传播 可以获取System最高权限 2 主要对windows服务器 主机有较大影响 黑客利用病毒对电脑重要文件进行加密 索要高比特币
  • 仓库管理系统c#语言代码,C#仓库管理系统+完整源代码

    Name MineFrame File MineFrame cs Description 此类用于仓库管理系统主界面的操作管理 Author XXX DateTime 2008年6月17日 using System using System
  • Node.js中设置时区的方法

    process env TZ Asia Shanghai 转载于 https www cnblogs com luluzero p 6339304 html
  • input选择保存的文件夹路径

    input添加这两个属性directory nwdirectory
  • stl_set

    begin 返回指向第一个元素的 迭代器 clear 清除所有元素 size 集合中元素的数目 count 返回某个值元素的个数 empty 如果集合为空 返回true 真 end 返回指向最后一个元素之后的迭代器 不是最后一个元素器 in
  • vue 省市区三级联动选择 pc端项目插件element-china-area-data(非常推荐)

    使用步骤 1 npm install element china area data S 2 import provinceAndCityData regionData provinceAndCityDataPlus regionDataP
  • 解决挂载ext4格式文件系统错误 JBD2: Unrecognised features on journal问题

    1 mount demo img mnt dmesg 报如下错误 1479130 280508 JBD2 Unrecognised features on journal 1479130 280512 EXT4 fs loop1 error
  • python 如果你的年龄大于18_python基础

    在python是空格是很重要的比如 如果在print前面加一个空格就会报错 在python中你必须顶格写 if 要判断的条件 条件成立时要执行的事情 图1 在图1中要判断的条件是年龄是不是大于18岁 大于18岁就可以去酒吧了 else语句配
  • Qt实现简单的显示网页(QtWebkit、QtWebEngine、QAxWidget)

    首先先说说QtWebkit QtWebEngine QAxWidget三种方式显示网页的应用场景 QtWebkit 在Qt5 6以前 都是使用QtWebkit组件 但Qt5 6以后 移除了QtWebkit这个组件 QtWebEngine Q
  • 握手信号valid/ready的打拍技巧

    一 前言 valid和ready信号 尤其是ready信号的时序一般很差 因为它通常是接收端通过组合逻辑输出的 当流水线的级数较多时 ready反压信号一级一级往前传递 时序将会变得更差 为了优化时序 通常需要对valid和ready信号进
  • Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测

    Pyhton OpenCV对象检测之 Haar级联人脸及眼睛检测 1 效果图 2 原理 2 1 Haar人脸检测原理 2 2 Haar级联预训练的模型 3 源码 3 1 图像面部及眼睛检测 3 2 视频帧面部及眼睛检测 参考 这篇博客将介绍
  • CMD找不到Python?

    前言 当我们费完一牛一虎之力给我们的Windows装上python后 却发现在CMD中输入python时发生这样一幕 D gt python python 不是内部或外部命令 也不是可运行的程序或批处理文件 那么这就需要来Look一下这篇文
  • shell中条件判断单双中括号&数值比较&字符串比较

    文章目录 条件判断中的单双中括号 单中括号 双中括号 背景 在修改centreon监控脚本的时候发现shell脚本中if判断条件使用的几点疑问 遂记录 条件判断中的单双中括号 样例1如下 判断当前小时 24小时制 是否大于2点 time d
  • [Interview系列 知识储备回顾] 集合篇 - Map[1]

    concurrentHashMap考点分析 concurrentHashMap在JDK 1 7怎么解决线程安全 concurrentHashMap在JDK 1 8怎么解决线程安全 concurrentHashMap在JDK 1 7怎么解决线
  • JeeSite数据权限控制解决方案

    支持如下数据范围设置 所有数据 所在公司及以下数据 所在公司数据 所在部门及以下数据 所在部门数据 仅本人数据 按明细设置 特殊情况下 跨机构授权 User user UserUtils getUser 使用标准查询 DetachedCri