1.编写拦截器SqlMapInterceptor 实现 HandlerInterceptor 接口
package com.meishi.core.interceptor;
import com.github.ag.core.context.BaseContextHandler;
import com.google.common.collect.Lists;
import com.meishi.core.enums.DataRangeEnum;
import com.meishi.security.api.service.IUserDepartIdsFeignApi;
import com.meishi.security.api.service.IUserFeignApi;
import com.meishi.security.api.service.IUserGroupDataRangeFeignApi;
import com.meishi.security.api.vo.user.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class SqlMapInterceptor implements HandlerInterceptor {
@Autowired
private IUserDepartIdsFeignApi userDepartIdsFeignApi;
@Autowired
private IUserGroupDataRangeFeignApi userGroupDataRangeFeignApi;
@Autowired
private IUserFeignApi userFeignApi;
//定义一个线程域,存放拼接的sqlMap,解决线程安全问题
private static final ThreadLocal<HashMap<String, String>> TL = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
StringBuilder sql = new StringBuilder();
HashMap<String, String> sqlMap = new HashMap<>();
String tenantId = BaseContextHandler.getTenantID();
String userID = BaseContextHandler.getUserID();
//查询用户所在组的数据权限,有多个角色权限时取最大权限
if (userID != null) {
List<String> userGroupDataRange;
String finalUserGroupDataRange;
try {
userGroupDataRange = userGroupDataRangeFeignApi.getUserGroupDataRange(userID);
if (userGroupDataRange.contains(DataRangeEnum.ALL_DATA.getValue())) {
finalUserGroupDataRange = DataRangeEnum.ALL_DATA.getValue();
} else if (userGroupDataRange.contains(DataRangeEnum.DEPART.getValue())) {
finalUserGroupDataRange = DataRangeEnum.DEPART.getValue();
} else {
finalUserGroupDataRange = DataRangeEnum.PERSONAL.getValue();
}
} catch (Exception e) {
log.error("用户组数据范围获取异常!", e);
return false;
}
UserInfo user = userFeignApi.getUserById(userID);
List<UserInfo> subordinateList = Lists.newArrayList();
List<String> subordinateIds = Lists.newArrayList();
if (user.getNo() != null) {
subordinateList = userGroupDataRangeFeignApi.getSubordinate(user.getNo());
}
if (!CollectionUtils.isEmpty(subordinateList)) {
subordinateIds = subordinateList.stream().map(UserInfo::getId).collect(Collectors.toList());
}
//如果所在组的数据范围为空,或者范围为“仅本人”,查看本人数据及下级数据
if (finalUserGroupDataRange == null || finalUserGroupDataRange.equals(DataRangeEnum.PERSONAL.getValue())) {
subordinateIds.add(userID);
StringBuilder subordinateSql = new StringBuilder();
for (int i = 0; i < subordinateIds.size(); i++) {
if (i != (subordinateIds.size() - 1)) {
subordinateSql.append("'").append(subordinateIds.get(i)).append("',");
} else {
subordinateSql.append("'").append(subordinateIds.get(i)).append("'");
}
}
sql.append(" a.crt_user_id in (").append(subordinateSql).append(") ");
sqlMap.put("dataFiltering", sql.toString());
TL.set(sqlMap);
return true;
} else if (finalUserGroupDataRange.equals(DataRangeEnum.DEPART.getValue())) { //如果数据范围为“按部门”,查询该用户相关的部门数据
try {
List<String> departIds = userDepartIdsFeignApi.getUserDepartIds(userID);
if (departIds != null && departIds.size() > 0) {
StringBuilder departSql = new StringBuilder();
for (int i = 0; i < departIds.size(); i++) {
if (i != (departIds.size() - 1)) {
departSql.append("'").append(departIds.get(i)).append("',");
} else {
departSql.append("'").append(departIds.get(i)).append("'");
}
}
sql.append(" a.depart_id in (").append(departSql).append(") ");
}
sqlMap.put("dataFiltering", sql.toString());
TL.set(sqlMap);
return true;
} catch (Exception e) {
log.error("部门ids获取异常!", e);
return false;
}
} else if (finalUserGroupDataRange.equals(DataRangeEnum.ALL_DATA.getValue())) { //如果数据范围为“所有数据”,查询本公司所有数据
sql.append(" a.tenant_id = '").append(tenantId).append("'");
sqlMap.put("dataFiltering", sql.toString());
TL.set(sqlMap);
return true;
} else { //其它情况,默认只查本人数据及下级数据
subordinateIds.add(userID);
StringBuilder subordinateSql = new StringBuilder();
for (int i = 0; i < subordinateIds.size(); i++) {
if (i != (subordinateIds.size() - 1)) {
subordinateSql.append("'").append(subordinateIds.get(i)).append("',");
} else {
subordinateSql.append("'").append(subordinateIds.get(i)).append("'");
}
}
sql.append(" a.crt_user_id in (").append(subordinateSql).append(") ");
sqlMap.put("dataFiltering", sql.toString());
TL.set(sqlMap);
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object
o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse
httpServletResponse, Object o, Exception e) throws Exception {
TL.remove();
}
//提供静态方法获取线程域中的sqlMap
public static HashMap<String, String> getSqlMap() {
return TL.get();
}
}
2.在对应模块config中进行配置 需要继承WebMvcConfigurerAdapter
package com.meishi.mall.config;
import com.github.wxiaoqi.security.auth.client.interceptor.ServiceAuthRestInterceptor;
import com.github.wxiaoqi.security.auth.client.interceptor.UserAuthRestInterceptor;
import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler;
import com.meishi.core.interceptor.SqlMapInterceptor;
import com.meishi.mall.Interceptor.OrderSqlMapInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 拦截器和全局配置
*
* @author ace
* @version 2017/9/8
*/
@Configuration("securityWebConfig")
@Primary
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Bean
GlobalExceptionHandler getGlobalExceptionHandler() {
return new GlobalExceptionHandler();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
增加用户信息拦截器
*/
registry.addInterceptor(getSqlMapInterceptor()).addPathPatterns("/**");
}
/**
* 配置用户信息拦截
* @return
*/
@Bean
SqlMapInterceptor getSqlMapInterceptor() {
return new SqlMapInterceptor();
}
3.使用该拦截器
@ApiOperation("分页查询")
@GetMapping(value = "/list")
public ActionResult list(@RequestParam Map<String, Object> params) {
HashMap<String, String> sqlMap = SqlMapInterceptor.getSqlMap();
String dataFiltering = sqlMap.get("dataFiltering").substring(3);
List<String> list = Arrays.asList(new String[]{"create_time"});
return new ActionResult<>(StatusCode.SUCCESS, iUmsMemberService.selectPage(new Query<>(params),
new EntityWrapper<UmsMember>().eq("deleted", 0).addFilter(dataFiltering).orderDesc(list)));
}