java aop 重置返回值

今天药忘吃喽~ 2024-04-03 07:16 140阅读 0赞

文章目录

  • 场景
  • 例子
  • 过滤返回值

场景

A同学是领导,可以看到表格内所有记录
B同学是助理,只能看到编号、名称、分类
C同学是后勤,价值和折旧没权限看,其他都可以
在这里插入图片描述

例子

接口返回值:

  1. {
  2. "code": "200",
  3. "msg": "查询成功",
  4. "data": [
  5. {
  6. "name": "name部门",
  7. "id": "1566623676155715586",
  8. "msg": "a"
  9. },
  10. {
  11. "name": "name行政后勤",
  12. "id": "1566623680589094913",
  13. "msg": "b"
  14. }
  15. ]
  16. }

通过权限控制,改变返回值,删除 msg

  1. {
  2. "code": "200",
  3. "msg": "查询成功",
  4. "data": [
  5. {
  6. "name": "name部门",
  7. "id": "1566623676155715586"
  8. },
  9. {
  10. "name": "name行政后勤",
  11. "id": "1566623680589094913"
  12. }
  13. ]
  14. }

过滤返回值

配置切面 RespPermissionAop

  • 配置权限开关
  • 结果为抛出异常,则直接返回
  • 判断方法名是否包含 list 或者 page
  • listPermissionLabel:有权限的列
  • objToList:把 data 从Object 转成 JSONObject List
  • permissionColumns:按需展示有权限的列,如把 id、name、msg,转换成 id、name

切面aop,对 controller 进行统一过滤

  1. @Slf4j
  2. @Aspect
  3. @Component
  4. public class RespPermissionAop {
  5. private static final String METHOD_EXCEPTION = "Exception";
  6. private static final String METHOD_lIST = "list";
  7. private static final String METHOD_PAGE = "page";
  8. private static final String PERMISSION_Y = "y";
  9. @Resource
  10. IPermissionService permissionService;
  11. @Resource
  12. PermissionProperty permissionProperty;
  13. @Pointcut("execution (* com.njc.java.controller.*.*(..))")
  14. public void point() {
  15. }
  16. @Around("point()")
  17. public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
  18. Object obj = joinPoint.proceed();
  19. log.info("obj: {}", obj);
  20. if(!PERMISSION_Y.toLowerCase().equals(permissionProperty.getInterfaces().toLowerCase())){
  21. log.info("interface 权限未开启");
  22. return obj;
  23. }
  24. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  25. String controllerName = joinPoint.getTarget().getClass().getName();
  26. controllerName = controllerName.substring(controllerName.lastIndexOf(".") + 1);
  27. String methodName = signature.getName();
  28. log.info("controllerName: {}, methodName: {}", controllerName, methodName);
  29. if (methodName.lastIndexOf(METHOD_EXCEPTION) > 0) {
  30. log.error("exception");
  31. return obj;
  32. }
  33. if (methodName.toLowerCase().lastIndexOf(METHOD_lIST) > -1 || methodName.toLowerCase().lastIndexOf(METHOD_PAGE) > -1) {
  34. List<String> labels = listPermissionLabel(UserUtil.getUserId(), controllerName, methodName);
  35. if (CollectionUtils.isEmpty(labels)) {
  36. log.info("无数据权限控制列,返回全部列");
  37. return obj;
  38. }
  39. NjcResponseEntity njcResponseEntity = BeanUtil.toBean(obj, NjcResponseEntity.class);
  40. Object data = njcResponseEntity.getData();
  41. if (methodName.lastIndexOf(METHOD_lIST) > -1) {
  42. log.info("列表查询");
  43. if (data instanceof List<?>) {
  44. List<JSONObject> list = objToList(data);
  45. log.info("list:{}", list);
  46. List<JSONObject> respList = permissionColumns(list, labels);
  47. log.info("respList:{}", respList);
  48. njcResponseEntity.setData(respList);
  49. return njcResponseEntity;
  50. } else {
  51. log.info("instanceof 判断类型失败,返回全部列");
  52. }
  53. }
  54. if (methodName.lastIndexOf(METHOD_PAGE) > -1) {
  55. log.info("分页查询");
  56. if (data instanceof IPage<?>) {
  57. IPage<?> ipage = (IPage<?>) data;
  58. List<JSONObject> list = objToList(ipage.getRecords());
  59. log.info("list:{}", list);
  60. List<JSONObject> respList = permissionColumns(list, labels);
  61. log.info("respList:{}", respList);
  62. IPage<JSONObject> page = TransformUtil.page(ipage, JSONObject.class);
  63. page.setRecords(respList);
  64. njcResponseEntity.setData(page);
  65. return njcResponseEntity;
  66. } else {
  67. log.info("instanceof 判断类型失败,返回全部列");
  68. }
  69. }
  70. } else {
  71. log.info("非分页查询 and 非列表查询");
  72. }
  73. return obj;
  74. }
  75. }

对象转list

  1. private static List<JSONObject> objToList(Object obj) {
  2. List<JSONObject> result = new ArrayList<>();
  3. if (obj instanceof List<?>) {
  4. for (Object o : (List<?>) obj) {
  5. result.add(JSONUtil.parseObj(o));
  6. }
  7. return result;
  8. }
  9. return null;
  10. }

转换有权限的列

  1. private static List<JSONObject> permissionColumns(List<JSONObject> list, List<String> columns) {
  2. List<JSONObject> respList = new ArrayList<>();
  3. for (JSONObject s : list) {
  4. JSONObject newObj = new JSONObject();
  5. JSONObject obj = JSONUtil.parseObj(s);
  6. for (String column : columns) {
  7. newObj.putOnce(column, obj.get(column));
  8. }
  9. respList.add(newObj);
  10. }
  11. return respList;
  12. }

获取有权限的列

  1. private List<String> listPermissionLabel(Long userId, String controllerName, String methodName) {
  2. List<String> list = new ArrayList<>();
  3. list.add("id");
  4. list.add("name");
  5. return list;
  6. }

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql自增长

    在使用mysql数据库时,相信很多人都会设置一个字段为主键自增长 由于测试程序,会产生许多数据 如果把这些数据删除 ,那么这些数据删除就会印象主键id的值,使得再次添加数据