一、 引言

  • 业务场景
    在一个类似数据统计的系统中,由于统计的数据较多,就有较多的表,每个表有较多的字段,但是又不想让每个用户都看到全部的表或者表的全部字段,比如一些重要的统计数据,应该是只有管理员才能看到的。
    举个例子(无实际意义)

    ID name day_amount week_amount month_amount
    1 脑点子 1,000 7,000 30,000

    A用户只能看到name,day_amount 两个字段;B用户只能看到name,month_amount两个字段。

二、 方案

  • 方案一

    • 用户表、用户-表名-字段映射表
      优点:实现简单
      缺点:每个用户,每个表,每个字段都需单独设置,较为繁琐
  • 方案二

    • 用户表、角色表、用户-角色映射表、角色-表名-字段映射表(优先级低)、用户-表名-字段映射表(优先级高)
      优点:可通过角色实现批量设置权限;且也可对某个用户权限进行单独设置
      缺点:权限局限于数据库单个表。
  • 方案三

    • 用户表、角色表、用户-角色映射表、数据类型表、类型-表名-字段映射表(优先级低)、角色-类型映射表、用户-表名-字段映射表(优先级高)
      优点:在方案二的基础上,可实现跨表的权限控制。
      缺点:实现较为繁琐,要不要采用主要还是根据用户的需求
  • 对外权限分配接口

    • 三种都按照表名作为一级节点,字段作为二级节点来分配权限。
    • 方案一只能按照单个用户来分配权限
    • 方案二按照角色/单个用户来分配
    • 方案三按照类型/单个用户来分配
  • 存在的问题

    • 1)数据库结构变更时,与该表相关的所有权限都需要重新设置
    • 2)部分不在数据库的字段,如根据多列的值计算出来的属性字段的权限不好处理。
    • 3)只支持单张表的查询,不支持多表查询
    • 部分解决思路
      • 问题2)的暂时的解决思路是:再单独建一张表——用户/角色/类型-JAVA类名-属性名映射表,再配合JSON序列化的属性过滤来实现权限控制。这种方式基本跟完全写死没什么区别,对后期的维护及扩展极不友好!
      • 问题3)的解决思路是:放弃掉SQL语句的连接查询,全部改成由代码控制

三、 代码

最初是打算在Spring Aop的前置通知中通过修改目标方法参数来实现,但是通过源码发现封装目标方法参数的类是用final修饰的,所以后面换了种思路。

使用Spring的AbstractAutoProxyCreator自动代理实现,思路是通过条件判断决定是否要使用自动代理,要使用代理的话,就需要自己实现MethodInterceptor接口并重写其中invoke方法。

下面我贴出核心代码,文章最后会给出整个demo的链接

继承AbstractAutoProxyCreator类,重写getAdvicesAndAdvisorsForBean()方法

public class BeanTypeAutoProxyCreator extends AbstractAutoProxyCreator {@Overrideprotected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource customTargetSource) throws BeansException {return isMatch(beanClass) ? PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS : DO_NOT_PROXY;}/*** 判断是否是需要被代理的对象* @param clazz 代理对象的类型* @return*/private boolean isMatch(Class<?> clazz) {//有两个Class类型的类象,一个是调用isAssignableFrom方法的类对象(后称对象a),// 以及方法中作为参数的这个类对象(称之为对象b),这两个对象如果满足以下条件则返回true,否则返回false://a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口//a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口if (BaseMapper.class.isAssignableFrom(clazz)) {return true;}return false;}
}

实现MethodInterceptor接口,重写invoke()方法

public class MyMethodInterceptor implements MethodInterceptor {@Autowiredprivate SysAccess sysAccess;@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {// 权限封装类SysAccessCriteria result = null;int flag = -1;// 目标方法的参数Object[] args = invocation.getArguments();for (int i=0; i<args.length; i++) {// 只修改权限条件类型的参数if(args[i] instanceof SysAccessCriteria){SysAccessCriteria sysAccessCriteria = (SysAccessCriteria) args[i];result = sysAccess.getUserAceess(sysAccessCriteria);flag = i;}}// 修改目标参数if(flag >= 0 && result != null){args[flag] = result;}// 执行目标方法Object object = invocation.proceed();return object;}
}

配置到Spring配置文件中

<bean id="myMethodInterceptor" class="com.ysl.access.proxy.MyMethodInterceptor"></bean>
<!--配置自动代理-->
<bean id="myBeanTypeAutoProxyCreator" class="com.ysl.access.proxy.BeanTypeAutoProxyCreator"><!--父类属性--><property name="interceptorNames"><list><value>myMethodInterceptor</value></list></property>
</bean>

Demo完整代码(数据库文件在resources目录下):https://github.com/andus-top/columns-accsss
单纯个人设计,应该有很多不足,有不好的地方可以指出,或者有更好的想法可以评论,一起交流。

参考:
https://blog.csdn.net/lilongjiu/article/details/78047051

MySQL数据库字段级权限设计相关推荐

  1. 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,期限控制,参数调试等)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127669684 长期持续项目技术分享,有专业Qt需求请 ...

  2. mysql数据库建设网站,网站设计与建设-MySQL数据库【松柏书屋】

    <网站设计与建设-MySQL数据库[松柏书屋]>由会员分享,可在线阅读,更多相关<网站设计与建设-MySQL数据库[松柏书屋](64页珍藏版)>请在人人文库网上搜索. 1.第2 ...

  3. MySql数据库中的权限授予

    MySql数据库中的权限授予 授予权限 需要使用实例级账户登录后操作,以root为例主要操作包括:查看所有用户 修改密码 删除用户 1. 查看所有用户 所有用户及权限信息存储在mysql数据库的use ...

  4. mysql与数据处理,[转载]Mysql数据库千万级数据处理优化

    转载:http://blog.sina.com.cn/s/blog_6dcd17320100tm6o.html 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by ...

  5. MySQL数据库表结构的设计

    一.前言 1.1 关系型数据库 数据库关系型模型的概念最早由"关系数据库之父"之称的埃德加·弗兰克·科德(Edgar Frank Codd或E. F. Codd)博士提出,1970 ...

  6. MySQL 数据库 User表权限以及用户授权详解

    转载:https://blog.mimvp.com/article/27956.html MySQL 常用权限操作 1)本机登陆mysql: mysql -u root -p (-p一定要有):改变数 ...

  7. 开发技巧-使用SQL与Navicat快速导出一个自定义的MYSQL数据库字段表格(数据字典)为Word或Excel

    1.基于MYSQL快速形成数据字典表格(数据库字段表格元信息)的需求 在书写数据库开发文档或相关文章时,总是可能应用到所设计的数据库元信息,形成一个科学的数据字典表格,相比传统的在Word.Excel ...

  8. mysql数据库应用的权限层级_MySQL数据库的用户权限管理

    嗨!各位小伙伴 今天翻了一下历史记录 MySQL 数据库还有点内容 今天开始我们就来补上吧~ 用户权限管理 伙伴们要知道,在数据库方面有两个方向.一个是数据库管理员(Database Administ ...

  9. mysql数据库应用的权限层级_涂抹MySQL--第5章 MySQL数据库中的权限体系 - 5.3权限级别(1)...

    5.3 权限级别 总的来说,MySQL数据库的权限从大的粒度上划分可以分成5类:全局.数据库.表.列.程序.通过对这5个大类权限的细分,可以精确地为某个用户分配从某台机器连接进来访问某个数据库下某个表 ...

  10. 案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127214512 长期持续项目技术分享,有需求请回博客首 ...

最新文章

  1. 网络营销十技之六:联署计划营销
  2. MySQL存储过程详解 mysql 存储过程
  3. CMD(SA400 Command)
  4. 自己动手写一个印钞机 第二章
  5. 华为认证数通专家HCIE-Datacom 11月30日发布
  6. 通过url 下载文件
  7. 写出完美CSS代码的5个重要方面
  8. 实例47:python
  9. android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...
  10. 分享3个数据分析实战项目(附最新资料包)
  11. 视觉SLAM笔记(27) 非线性最小二乘
  12. ecshop内页显示最新文章
  13. 积分商城使用教程之优惠券
  14. 整车CAN网络拓扑图
  15. 使用AIL(Android Init Language)解释servicemanager.rc语句作用
  16. 【数字设计】恒玄科技_笔试面试题目分享
  17. 第三阶段应用层——1.2 数码相册—字符编码
  18. ipad/ios按钮背景颜色为渐变色?去除iOS按钮渐变色
  19. HTML5七夕情人节表白网页抖音超火的樱花雨3D相册 HTML+CSS+JavaScript
  20. python 中控考勤机实时接收打卡数据(QThread)

热门文章

  1. 阿里巴巴电话面试(遭到了阿里的完虐,被一顿痛批)
  2. Android之简洁天气
  3. TMR 传感器的原理及应用
  4. 计算机 服装生产管理的变化,服装生产与管理服装生产管理概述.ppt
  5. 尚品宅配:最互联网的定制家居增长新势力,如何三招实现疫情期的逆势增长?
  6. 服务器常见基本故障+排查方法,很实用!
  7. FSL ICA-FIX配置及处理流程
  8. aspjpeg组件在2008R2下“ActiveX 部件不能创建对象”
  9. 十六进制和二进制相互转换(快速转换)
  10. 计算机网络管理员初级是几级,计算机网络管理员初级操作技能考核试题