|
@@ -1,21 +1,25 @@
|
|
|
package com.diagbot.util;
|
|
|
|
|
|
+import com.diagbot.dto.PermissionDTO;
|
|
|
+import com.diagbot.dto.PermissionParamDTO;
|
|
|
import com.diagbot.exception.CommonErrorCode;
|
|
|
import com.diagbot.exception.CommonException;
|
|
|
import com.diagbot.facade.PermissionFacade;
|
|
|
+import com.diagbot.vo.PermissionVO;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.aspectj.lang.JoinPoint;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
|
|
import org.springframework.core.ParameterNameDiscoverer;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
import org.springframework.web.context.request.RequestAttributes;
|
|
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.lang.reflect.Field;
|
|
|
import java.lang.reflect.Method;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* @Description:
|
|
@@ -23,9 +27,14 @@ import java.util.Map;
|
|
|
* @time: 2020/2/17 14:57
|
|
|
*/
|
|
|
@Slf4j
|
|
|
+@Component
|
|
|
public class PermissionUtil {
|
|
|
+ private static PermissionFacade permissionFacade;
|
|
|
+
|
|
|
@Autowired
|
|
|
- private PermissionFacade permissionFacade;
|
|
|
+ public PermissionUtil(PermissionFacade permissionFacade) {
|
|
|
+ PermissionUtil.permissionFacade = permissionFacade;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 功能可配置权限拦截
|
|
@@ -42,12 +51,44 @@ public class PermissionUtil {
|
|
|
if (StringUtil.isBlank(hospitalCode)) {
|
|
|
throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请传入医院编码!");
|
|
|
}
|
|
|
+ if (sysType == null) {
|
|
|
+ throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请传入系统类型!");
|
|
|
+ }
|
|
|
//todo 远程获取权限验证权限
|
|
|
//验证权限
|
|
|
String uri = request.getRequestURI();
|
|
|
log.info(uri);
|
|
|
+ PermissionVO permissionVO = new PermissionVO();
|
|
|
+ permissionVO.setHospitalCode(hospitalCode);
|
|
|
+ permissionVO.setSysType(sysType);
|
|
|
+ PermissionDTO permissionDTO = permissionFacade.getPermission(permissionVO);
|
|
|
+ Map<String, PermissionParamDTO> hasParamMap = new HashMap<>();
|
|
|
+ Map<String, PermissionParamDTO> noParamMap = new HashMap<>();
|
|
|
+ if (permissionDTO.getPermissionMap() != null) {
|
|
|
+ hasParamMap = permissionDTO.getPermissionMap().get("hasParam");
|
|
|
+ noParamMap = permissionDTO.getPermissionMap().get("noParam");
|
|
|
+ }
|
|
|
+
|
|
|
//todo 验证是否在无参数的Map
|
|
|
+ Boolean noParam = false;
|
|
|
+ if (noParamMap != null) {
|
|
|
+ if (noParamMap.containsKey(uri)) {
|
|
|
+ noParam = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
//todo 验证是否在有参数的Map
|
|
|
+ Boolean hasParam = false;
|
|
|
+ Map<String, Set<String>> permissionParamMap = new HashMap<>();
|
|
|
+ if (hasParamMap != null) {
|
|
|
+ if (hasParamMap.containsKey(uri)) {
|
|
|
+ hasParam = true;
|
|
|
+ permissionParamMap = hasParamMap.get(uri).getParamMap();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!noParam && !hasParam) {
|
|
|
+ throw new CommonException(CommonErrorCode.NO_PERMISSION, "当前医院没有开通此功能!");
|
|
|
+ }
|
|
|
//todo 验证参数
|
|
|
Object[] args = joinPoint.getArgs();
|
|
|
if (args == null) {
|
|
@@ -57,10 +98,71 @@ public class PermissionUtil {
|
|
|
Map<String, Object> paramMap = new HashMap<>();
|
|
|
paramMap = getFieldsName(joinPoint);
|
|
|
//todo 利用paramMap获取结果
|
|
|
+ try {
|
|
|
+ if (!noParam && hasParam && permissionParamMap != null) {
|
|
|
+ for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
|
|
|
+ if (entry.getValue() == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Field[] fields = getAllFields(entry.getValue());
|
|
|
+ for (int i = 0; i < fields.length; i++) {
|
|
|
+ String fieldName = fields[i].getName();
|
|
|
+ if (permissionParamMap.containsKey(fieldName)) {
|
|
|
+ Set<String> permissionParamValueSet = permissionParamMap.get(fieldName);
|
|
|
+ if (permissionParamValueSet == null || permissionParamValueSet.size() == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String getter = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
|
|
|
+ String type = fields[i].getGenericType().toString();
|
|
|
+ Class clazz = entry.getValue().getClass();
|
|
|
+ Method method = clazz.getMethod(getter, new Class[]{});
|
|
|
+ Object obj = method.invoke(entry.getValue(), new Object[]{});
|
|
|
+ if (type.equals("class java.lang.String")
|
|
|
+ || type.equals("class java.lang.Integer")
|
|
|
+ || type.equals("class java.lang.Long")) {
|
|
|
+ String value = (String) obj;
|
|
|
+ String[] valueArr = value.split(",|,");
|
|
|
+ Set<String> valueSet = new HashSet<>(Arrays.asList(valueArr));
|
|
|
+ Boolean flag = false;
|
|
|
+ System.out.println(flag.toString());
|
|
|
+ for (String permissionParamValue : permissionParamValueSet) {
|
|
|
+ Set paramValueSet = new HashSet<>(Arrays.asList(permissionParamValue.split(",|,")));
|
|
|
+ if (paramValueSet.containsAll(valueSet)) {
|
|
|
+ flag = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!flag) {
|
|
|
+ throw new CommonException(CommonErrorCode.NO_PERMISSION, "当前医院没有开通此功能!");
|
|
|
+ }
|
|
|
+ } else if (type.equals("class java.lang.Boolean")) {
|
|
|
+ Boolean value = (Boolean) obj;
|
|
|
+ if (!permissionParamValueSet.contains(value.toString())) {
|
|
|
+ throw new CommonException(CommonErrorCode.NO_PERMISSION, "当前医院没有开通此功能!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new CommonException(CommonErrorCode.FAIL, e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
+ public static Field[] getAllFields(Object object) {
|
|
|
+ Class clazz = object.getClass();
|
|
|
+ List<Field> fieldList = new ArrayList<>();
|
|
|
+ while (clazz != null) {
|
|
|
+ fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
|
|
|
+ clazz = clazz.getSuperclass();
|
|
|
+ }
|
|
|
+ Field[] fields = new Field[fieldList.size()];
|
|
|
+ fieldList.toArray(fields);
|
|
|
+ return fields;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
private static Map getFieldsName(JoinPoint joinPoint) {
|
|
|
try {
|
|
|
String classType = joinPoint.getTarget().getClass().getName();
|