java-com-util-common-service:BaseService.java
ylbtech-java-com-util-common-service:BaseService.java |
1.返回顶部 |
package com.shineyoo.manager.util.common.service;import java.util.List;import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional;import com.shineyoo.manager.util.common.persistence.BaseEntity; import com.shineyoo.manager.util.modules.sys.entity.Role; import com.shineyoo.manager.util.modules.sys.entity.User; import com.google.common.collect.Lists;/*** Service基类* @author* @version 2014-05-16*/ @Transactional(readOnly = true) public abstract class BaseService {/*** 日志对象*/protected Logger logger = LoggerFactory.getLogger(getClass());/*** 数据范围过滤* @param user 当前用户对象,通过“entity.getCurrentUser()”获取* @param officeAlias 机构表别名,多个用“,”逗号隔开。* @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数* @return 标准连接条件对象*/public static String dataScopeFilter(User user, String officeAlias, String userAlias) {StringBuilder sqlString = new StringBuilder();// 进行权限过滤,多个角色权限范围之间为或者关系。List<String> dataScope = Lists.newArrayList();// 超级管理员,跳过权限过滤if (!user.isAdmin()){boolean isDataScopeAll = false;for (Role r : user.getRoleList()){for (String oa : StringUtils.split(officeAlias, ",")){if (!dataScope.contains(r.getDataScope()) && StringUtils.isNotBlank(oa)){if (Role.DATA_SCOPE_ALL.equals(r.getDataScope())){isDataScopeAll = true;}else if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getCompany().getId() + "'");sqlString.append(" OR " + oa + ".parent_ids LIKE '" + user.getCompany().getParentIds() + user.getCompany().getId() + ",%'");}else if (Role.DATA_SCOPE_COMPANY.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getCompany().getId() + "'");// 包括本公司下的部门 (type=1:公司;type=2:部门)sqlString.append(" OR (" + oa + ".parent_id = '" + user.getCompany().getId() + "' AND " + oa + ".type = '2')");}else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getOffice().getId() + "'");sqlString.append(" OR " + oa + ".parent_ids LIKE '" + user.getOffice().getParentIds() + user.getOffice().getId() + ",%'");}else if (Role.DATA_SCOPE_OFFICE.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getOffice().getId() + "'");}else if (Role.DATA_SCOPE_CUSTOM.equals(r.getDataScope())){ // String officeIds = StringUtils.join(r.getOfficeIdList(), "','"); // if (StringUtils.isNotEmpty(officeIds)){ // sqlString.append(" OR " + oa + ".id IN ('" + officeIds + "')"); // }sqlString.append(" OR EXISTS (SELECT 1 FROM sys_role_office WHERE role_id = '" + r.getId() + "'");sqlString.append(" AND office_id = " + oa +".id)");}//else if (Role.DATA_SCOPE_SELF.equals(r.getDataScope())){ dataScope.add(r.getDataScope());}}}// 如果没有全部数据权限,并设置了用户别名,则当前权限为本人;如果未设置别名,当前无权限为已植入权限if (!isDataScopeAll){if (StringUtils.isNotBlank(userAlias)){for (String ua : StringUtils.split(userAlias, ",")){sqlString.append(" OR " + ua + ".id = '" + user.getId() + "'");}}else {for (String oa : StringUtils.split(officeAlias, ",")){//sqlString.append(" OR " + oa + ".id = " + user.getOffice().getId());sqlString.append(" OR " + oa + ".id IS NULL");}}}else{// 如果包含全部权限,则去掉之前添加的所有条件,并跳出循环。sqlString = new StringBuilder();}}if (StringUtils.isNotBlank(sqlString.toString())){return " AND (" + sqlString.substring(4) + ")";}return "";}/*** 数据范围过滤(符合业务表字段不同的时候使用,采用exists方法)* @param entity 当前过滤的实体类* @param sqlMapKey sqlMap的键值,例如设置“dsf”时,调用方法:${sqlMap.sdf}* @param officeWheres office表条件,组成:部门表字段=业务表的部门字段* @param userWheres user表条件,组成:用户表字段=业务表的用户字段* @example* dataScopeFilter(user, "dsf", "id=a.office_id", "id=a.create_by");* dataScopeFilter(entity, "dsf", "code=a.jgdm", "no=a.cjr"); // 适应于业务表关联不同字段时使用,如果关联的不是机构id是code。*/public static void dataScopeFilter(BaseEntity<?> entity, String sqlMapKey, String officeWheres, String userWheres) {User user = entity.getCurrentUser();// 如果是超级管理员,则不过滤数据if (user.isAdmin()) {return;}// 数据范围(1:所有数据;2:所在公司及以下数据;3:所在公司数据;4:所在部门及以下数据;5:所在部门数据;8:仅本人数据;9:按明细设置)StringBuilder sqlString = new StringBuilder();// 获取到最大的数据权限范围String roleId = "";int dataScopeInteger = 8;for (Role r : user.getRoleList()){int ds = Integer.valueOf(r.getDataScope());if (ds == 9){roleId = r.getId();dataScopeInteger = ds;break;}else if (ds < dataScopeInteger){roleId = r.getId();dataScopeInteger = ds;}}String dataScopeString = String.valueOf(dataScopeInteger);// 生成部门权限SQL语句for (String where : StringUtils.split(officeWheres, ",")){if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(dataScopeString)){// 包括本公司下的部门 (type=1:公司;type=2:部门)sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE type='2'");sqlString.append(" AND (id = '" + user.getCompany().getId() + "'");sqlString.append(" OR parent_ids LIKE '" + user.getCompany().getParentIds() + user.getCompany().getId() + ",%')");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_COMPANY.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE type='2'");sqlString.append(" AND id = '" + user.getCompany().getId() + "'");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE (id = '" + user.getOffice().getId() + "'");sqlString.append(" OR parent_ids LIKE '" + user.getOffice().getParentIds() + user.getOffice().getId() + ",%')");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_OFFICE.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE id = '" + user.getOffice().getId() + "'");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_CUSTOM.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM sys_role_office ro123456, sys_office o123456");sqlString.append(" WHERE ro123456.office_id = o123456.id");sqlString.append(" AND ro123456.role_id = '" + roleId + "'");sqlString.append(" AND o123456." + where +")");}}// 生成个人权限SQL语句for (String where : StringUtils.split(userWheres, ",")){if (Role.DATA_SCOPE_SELF.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM sys_user");sqlString.append(" WHERE id='" + user.getId() + "'");sqlString.append(" AND " + where + ")");}}// System.out.println("dataScopeFilter: " + sqlString.toString());// 设置到自定义SQL对象 entity.getSqlMap().put(sqlMapKey, sqlString.toString());}}
2.返回顶部 |
3.返回顶部 |
4.返回顶部 |
5.返回顶部 |
6.返回顶部 |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
转载于:https://www.cnblogs.com/storebook/p/9605369.html
java-com-util-common-service:BaseService.java相关推荐
- java联接pg库_Java14:使用Java 14的新记录联接数据库表
java联接pg库 您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将 ...
- java jwt 验证_教程:用Java创建和验证JWT
java jwt 验证 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多 ...
- java 调用 go_实践总结:在 Java 中调用 Go 代码
在 Java 中调用 Go 的大致过程如下go --> cgo --> jna --> java 整个过程要解决的问题主要两个:数据类型在两种语言中如何转化 何时清理无用的数据 下面 ...
- 数据结构java版txt,图解数据结构:使用Java
图解数据结构:使用Java 下载 mobi epub pdf ☆☆☆☆☆ 胡昭民 著 下载链接在页面底部 发表于2021-03-10 图书介绍 出版社: 清华大学出版社 ISBN:9787302402 ...
- java基础-宇宙第一YWM:入门java看书小发现
##java基础-宇宙第一YWM:书籍入门java 今天看了head first设计模式,其实从学Java基础开始就挺喜欢head first系列,而言很多前辈也都推荐过这两本,大家有空也可以看看.( ...
- Java多线程电影院,干货来袭:图解Java多线程(一)
Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. 什么是Java多线程? 进程与线程 进程 ...
- java链表list_数据结构-List:使用Java实现双向链表LinkedList
JDK中的LinkedList属于双向循环链表. 下面是使用Java来实现一个双向非循环链表. package org.cgz.practice2; import java.util.NoSuchEl ...
- vector java 复制_面试官:关于Java性能优化,你有什么技巧
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化. 一般有两种 ...
- java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?
为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨论话题. 如果你运行下面的代码: Integ ...
最新文章
- php 请求服务器时间设置,学习猿地-php如何设置服务器时间
- 利用 Cloudera 实现 Hadoop (一)
- hibernate mysql缓存机制_Hibernate的缓存机制
- 第 3 章 第 2 题 求级数问题 递归法实现
- Python平衡点问题
- 数据膨胀了?你的数仓又没有空间了?
- MySQL Proxy和 Amoeba 工作机制浅析
- Docker的常规应用手册
- 我对python的理解_python高级函数以及我对python的理解
- python数据导出excel_Python方法将DBF文件导出到Excel代码示例
- 如何用计算机计算平均温差,换热器传热计算的平均温差法.PPT
- Echarts官网Json获取方式
- IDEA 返回上一步 快捷键
- 拉绳位移传感器的原理
- TCP编程-端口扫描器
- upload-labs-master 通关分析
- 华为LTC流程再造(BPR)的来龙去脉,看一篇文就够了!管理变革专家许浩明老师
- autodesk fbx sdk sample里面的工程无法调试解决方法
- houdini 常用命令
- 轻松实现iMessage群发
热门文章
- html点击隐藏点击出现,点击按钮,内容隐藏,再点击一下,然后内容又显示了,这种效果怎么做?然后默认的是隐藏的...
- 卸载 流程_「工具」Windows 卸载软件,这一个就够了
- 本构二次开发 c语言,umat二次开发超弹性本构.doc
- mysql backdoor_Mysql UDF BackDoor
- 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题
- git第一次提交代码到码云,git pull 报错:fatal: refusing to merge unrelated histories
- 你知道面试必问的AOP吗(1),2021吊打面试官系列
- 【深度学习入门到精通系列】特别正经的合理调参介绍~❤️
- ppct各代表什么_开关背面L、L1、L2各代表什么?火线,零线,地线怎样接?
- 网站文章要求图文并茂,图片要怎样做好优化工作呢?