1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

#61 优化权限管理,根据部门过滤数据

This commit is contained in:
Hai Liang Wang 2018-09-07 19:07:52 +08:00
parent 0efb7615e0
commit cf2ecee7db
2 changed files with 353 additions and 317 deletions

View File

@ -17,6 +17,7 @@
package com.chatopera.cc.webim.web.handler; package com.chatopera.cc.webim.web.handler;
import static org.elasticsearch.index.query.QueryBuilders.termQuery; import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
import java.text.ParseException; import java.text.ParseException;
@ -25,6 +26,7 @@ import javax.servlet.http.HttpServletRequest;
import com.chatopera.cc.core.UKDataContext; import com.chatopera.cc.core.UKDataContext;
import com.chatopera.cc.util.UKView; import com.chatopera.cc.util.UKView;
import com.chatopera.cc.util.exception.CSKefuException;
import com.chatopera.cc.webim.service.cache.CacheHelper; import com.chatopera.cc.webim.service.cache.CacheHelper;
import com.chatopera.cc.webim.service.repository.TenantRepository; import com.chatopera.cc.webim.service.repository.TenantRepository;
import com.chatopera.cc.webim.web.handler.api.rest.QueryParams; import com.chatopera.cc.webim.web.handler.api.rest.QueryParams;
@ -36,6 +38,8 @@ import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder; import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator;
import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.index.query.RangeQueryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
@ -49,6 +53,8 @@ import com.chatopera.cc.webim.web.model.SystemConfig;
@Controller @Controller
@SessionAttributes @SessionAttributes
public class Handler { public class Handler {
private static final Logger logger = LoggerFactory.getLogger(Handler.class);
@Autowired @Autowired
private TenantRepository tenantRes; private TenantRepository tenantRes;
@ -86,6 +92,32 @@ public class Handler {
return user ; return user ;
} }
/**
* 构建ElasticSearch基于部门查询的Filter
* @param request
* @param boolQueryBuilder
* @return
* @throws CSKefuException
*/
public boolean esOrganFilter(final HttpServletRequest request, final BoolQueryBuilder boolQueryBuilder) throws CSKefuException {
// 组合部门条件
User u = getUser(request);
if( u == null){
throw new CSKefuException("[esOrganFilter] 未能获取到登录用户。");
} else if(u.isSuperuser()){
// 超级管理员, 查看任何数据
return true;
} else if(u.getMyorgans().size() == 0){
// 用户没有被分配到部门返回空数据
return false;
} else {
// 用户在部门中通过部门过滤数据
String[] values = u.getMyorgans().toArray(new String[u.getMyorgans().size()]);
boolQueryBuilder.filter(termsQuery("organ", values));
return true;
}
}
/** /**
* *
* @param queryBuilder * @param queryBuilder

View File

@ -17,29 +17,28 @@
package com.chatopera.cc.webim.web.handler.apps.contacts; package com.chatopera.cc.webim.web.handler.apps.contacts;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.chatopera.cc.util.Menu; import com.chatopera.cc.util.Menu;
import com.chatopera.cc.util.PinYinTools; import com.chatopera.cc.util.PinYinTools;
import com.chatopera.cc.util.UKTools;
import com.chatopera.cc.util.exception.CSKefuException;
import com.chatopera.cc.util.task.DSData;
import com.chatopera.cc.util.task.DSDataEvent;
import com.chatopera.cc.util.task.ExcelImportProecess;
import com.chatopera.cc.util.task.export.ExcelExporterProcess;
import com.chatopera.cc.util.task.process.ContactsProcess;
import com.chatopera.cc.webim.service.es.ContactsRepository;
import com.chatopera.cc.webim.service.repository.MetadataRepository;
import com.chatopera.cc.webim.service.repository.PropertiesEventRepository; import com.chatopera.cc.webim.service.repository.PropertiesEventRepository;
import com.chatopera.cc.webim.service.repository.ReporterRepository;
import com.chatopera.cc.webim.util.PropertiesEventUtils; import com.chatopera.cc.webim.util.PropertiesEventUtils;
import com.chatopera.cc.webim.web.handler.Handler;
import com.chatopera.cc.webim.web.model.*;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
@ -50,23 +49,21 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import com.chatopera.cc.util.UKTools; import javax.servlet.http.HttpServletRequest;
import com.chatopera.cc.util.task.DSData; import javax.servlet.http.HttpServletResponse;
import com.chatopera.cc.util.task.DSDataEvent; import javax.validation.Valid;
import com.chatopera.cc.util.task.ExcelImportProecess; import java.io.File;
import com.chatopera.cc.util.task.export.ExcelExporterProcess; import java.io.IOException;
import com.chatopera.cc.util.task.process.ContactsProcess; import java.text.SimpleDateFormat;
import com.chatopera.cc.webim.service.es.ContactsRepository; import java.util.*;
import com.chatopera.cc.webim.service.repository.MetadataRepository;
import com.chatopera.cc.webim.service.repository.ReporterRepository; import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import com.chatopera.cc.webim.web.handler.Handler; import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
import com.chatopera.cc.webim.web.model.Contacts;
import com.chatopera.cc.webim.web.model.MetadataTable;
import com.chatopera.cc.webim.web.model.PropertiesEvent;
@Controller @Controller
@RequestMapping("/apps/contacts") @RequestMapping("/apps/contacts")
public class ContactsController extends Handler { public class ContactsController extends Handler {
private final static Logger logger = LoggerFactory.getLogger(ContactsController.class);
@Autowired @Autowired
private ContactsRepository contactsRes; private ContactsRepository contactsRes;
@ -85,15 +82,22 @@ public class ContactsController extends Handler{
@RequestMapping("/index") @RequestMapping("/index")
@Menu(type = "customer", subtype = "index") @Menu(type = "customer", subtype = "index")
public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ckind) { public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String ckind) throws CSKefuException {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if(!super.esOrganFilter(request, boolQueryBuilder)){
return request(super.createAppsTempletResponse("/apps/business/contacts/index"));
}
if (!StringUtils.isBlank(q)) { if (!StringUtils.isBlank(q)) {
map.put("q", q); map.put("q", q);
} }
if (!StringUtils.isBlank(ckind)) { if (!StringUtils.isBlank(ckind)) {
boolQueryBuilder.must(termQuery("ckind", ckind)); boolQueryBuilder.must(termQuery("ckind", ckind));
map.put("ckind", ckind); map.put("ckind", ckind);
} }
map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request)))); map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request))));
return request(super.createAppsTempletResponse("/apps/business/contacts/index")); return request(super.createAppsTempletResponse("/apps/business/contacts/index"));