`
thinkgem
  • 浏览: 585938 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JeeSite数据权限控制解决方案

阅读更多

支持如下数据范围设置:

 

  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();
	}

 

分享到:
评论
5 楼 sdtaojianxin 2016-05-20  
我用管理员创建了一个角色A分配了部分权限,将A角色和B用户关联起来,B用户登录后,系统设置,代码生成这些菜单都出来了,这是怎么回事啊?这是实现好像不太合理啊
4 楼 lionheiheihei 2014-07-24  
不知道是不是我理解错,这样的数据权限,如果create_by那个人换了部门,那他之前所建立的数据不是无法被之前部门的人再看到了?
3 楼 usenrong 2013-11-15  
新开发的模块也自动受到这些数据级别上的权限控制吗?
2 楼 wang_godsun 2013-08-22  
ihanfeng 写道
权限控制没设计好,应该针对权限显示对应的菜单。你这个无论什么权限系统的菜单都显示出来,而且还是可以操作的。

这个是功能权限,本来就有了。
1 楼 ihanfeng 2013-06-21  
权限控制没设计好,应该针对权限显示对应的菜单。你这个无论什么权限系统的菜单都显示出来,而且还是可以操作的。

相关推荐

    jeesite-mysql-v5.0.1

    Jeesite-Mysql-V5.0.1 是一个基于Java语言开发的企业级Web应用框架,结合了MySQL数据库的强大功能,旨在提供高效、稳定且易于扩展的解决方案。在本篇中,我们将深入探讨Jeesite与MySQL V5.0.1版本的集成,以及相关的...

    jeesite 最早版本

    3. **数据权限**:提供精细的数据权限控制,可以根据角色、组织机构、用户等多种维度进行权限分配,确保数据安全。 4. **工作流引擎**:集成Activiti工作流引擎,实现业务流程的自动化管理,包括流程定义、审批、...

    jeesite项目

    【jeesite项目】是一个基于Java技术的企业级应用框架,由国内开发者开发并维护,旨在为快速构建稳定、安全、高效的企业级Web应用提供一套成熟的解决方案。该项目源码的开源特性使得开发者能够深入理解其内部机制,...

    jeesite工程

    - **强大的权限控制**:提供基于角色的权限控制,支持细粒度的菜单、按钮权限分配,以及数据权限的控制。 - **丰富的插件支持**:内置多种常用插件,如富文本编辑器、图片上传、文件管理等,满足日常开发需求。 - **...

    jeesite使用配置和API文档

    内容管理系统是企业信息化的重要组成部分,Jeesite 提供了一套完整的内容管理解决方案。文档将详细介绍内容的创建、编辑、发布和管理等功能,以及相关的权限控制。 **9. API 接口文档 (jeesite_help.chm)** 作为...

    jeesite框架

    Jeesite作为一个企业级应用框架,其设计目标是简化开发流程,提供一套完整的后台管理解决方案。它包含了权限管理、工作流引擎、报表统计等多个模块,能够满足大多数企业的基本需求。Jeesite的特点在于其高度模块化的...

    jeesite框架技术文档

    Jeesite是一款基于Java技术开发的开源企业级应用框架,它旨在简化企业级Web应用的开发流程,提供一套完整的解决方案。该框架结合了MVC模式、ORM映射、权限控制、工作流等核心功能,为开发者带来高效、稳定且易于维护...

    jeesite开源项目

    此外,Jeesite项目还包含了权限控制、工作流、报表等多个功能模块,这些模块的集成,为开发者提供了完整的业务应用解决方案。其中,权限控制模块如Shiro或Spring Security,可以帮助开发者轻松实现用户登录验证、...

    jeesite项目基础结构

    此外,Jeesite还提供了强大的权限控制、数据字典管理、日志记录等功能,便于开发者进行二次开发。通过模块化设计,开发者可以方便地添加新的功能模块或替换现有模块,以满足不同企业的业务需求。 总结来说,Jeesite...

    jeesite混合开发框架

    **混合开发框架——JeeSite** JeeSite是一款基于Java技术构建的企业级应用开发框架,旨在简化企业级应用的快速...无论是小型项目还是复杂的系统,JeeSite都能提供完善的解决方案,助力开发团队快速构建高质量的应用。

    jeesite3.7项目

    它提供了一套完整的解决方案,涵盖了从用户登录、权限管理到业务流程处理等多个方面,降低了开发复杂性和维护成本。 **升级与迁移** 虽然`jeesite3.7` 已经有新版本,但迁移或升级并不总是必要的。如果现有系统...

    JeeSite快速开发平台 v5.6.1.zip

    JeeSite是一款高效、灵活的企业级快速开发平台,其v5.6.1版本为用户提供了一个强大的建站解决方案。该平台的核心目标是降低系统开发的复杂度,提升开发效率,同时也为企业信息化建设提供了一个可靠的基石。 JeeSite...

    jeesite开发框架

    `jeesite` 是一个基于 Java 的开源企业级开发框架,它旨在简化企业级应用的开发流程,提供了一套完整的解决方案,包括基础功能、权限控制、工作流等模块。这个框架已经在实际项目中经过验证,证明其稳定性和实用性,...

    jeesite项目源码+Mysql脚本程序

    它的核心模块包括权限管理、内容管理、工作流、报表统计等多个方面,为开发者提供了一站式的解决方案。通过源码学习,我们可以了解到它如何巧妙地应用设计模式,如工厂模式、单例模式、代理模式等,以及如何实现AOP...

    jeesite 源码

    Jeesite是一款基于Java开发的企业级开源框架,它提供了全面的Web应用解决方案,集成了许多企业级功能,如权限管理、工作流、报表等,旨在简化开发过程,提升开发效率。本文将深入解析Jeesite源码,探讨其设计理念和...

    jeesite上传到服务器无法访问

    同时,可以参考Jeesite的官方文档、社区论坛或者相关博客(如博文链接:https://ctrlc.iteye.com/blog/2173521)获取解决方案。通过这样的方式,一般可以解决“jeesite上传到服务器无法访问”的问题。

    jeesite jar

    同时,Jeesite框架则提供了一套完整的开发解决方案,包括权限控制、数据字典、工作流等,使得开发者可以快速搭建企业级应用,降低开发难度和时间成本。 在使用【maven_resp.rar】时,首先需要解压文件,然后将`pom....

    thinkgem-jeesite4-master_JAVA源码_

    "thinkgem-jeesite4-master" 是一个基于JavaEE技术体系的全栈式开发框架,其核心目标是为企业提供一个屏蔽技术壁垒、高效实现业务需求的解决方案。这个框架,即AOSuite,以其强大的功能和易用性,受到了广大开发者的...

    jeesite快速开发框架源码

    Jeesite是一款基于SpringBoot构建的高效、易用的快速开发框架,旨在为Java开发者提供便捷的后台系统开发解决方案。这款框架结合了SpringBoot的强大功能和自身的一系列优秀特性,极大地提高了开发效率,降低了项目...

Global site tag (gtag.js) - Google Analytics