查看上篇文章通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤,我们开始在原来的基础上实现单条权记录的权限控制。
相信前面的列表权限控制,很多系统都可以做到,但如何在上面列表的权限过滤中实现通用性
原理:我们在权限过滤中,通过AOP接截相关记录,拦截的时候,我们先判断当前人员是否有角色权限,没有的话,我们生成查询权限的SQL,进行权限查找.
1.先定义生成权限的相关注解,相关注解用于权限拦截,及获取拦截的相关参数.

Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthCheck {/**权限校验规则* @return*/Class classModel() ;/***  判断是否IN查询* @return*/boolean isIn() default true;}

注解AuthCheck用于定义单条记录权限拦截的规则

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public  @interface AuthParam {
}

AuthParam只是用于标记哪个参数用于权限校验.
2.生成权限校验SQL的类AuthFiledFilter修改

  /*** 生成对一条记录的权限校限SQL* @param id* @param valueList* @return*/public String getAuthSqlIn(Object id, List valueList){StringBuffer sb = new StringBuffer();sb.append("select count(1) from ");sb.append (this.getSalveTableName() );sb.append(" where    ").append(this.getSalveTableField()).append("=").append(id);sb.append(" and ");sb.append(this.buildLogicIN(this.getSearchUserField(), valueList));return sb.toString();}/*** 生成对一条记录的权限校验SQL,用EQ* @param id* @param userId* @return*/public String getAuthSqlEq(Object id,Object userId){StringBuffer sb = new StringBuffer();sb.append("select count(1) from ");sb.append (this.getSalveTableName() );sb.append(" where    ").append(this.getSalveTableField()).append("=").append(id);sb.append(" and ");sb.append(  this.getSearchUserField()).append("=").append(userId);return sb.toString();}

3.权限拦截判断的类AuthValidatorUtil的规则增加

 //生成校验的public static String  getAuthModelSql(String classModel, Object id,boolean isIn) {AuthValidatorModel authValidatorModel = AuthConfig.get(classModel);if (authValidatorModel == null) {return "";}boolean isAuth = authValidatorModel.getRoles().stream().anyMatch(role -> UserUtil.containRole(role));if (isAuth) {return "";}String checkAuthSql="";if (isIn) {checkAuthSql = authValidatorModel.getAuthFiledFilter().getAuthSqlIn(id, UserUtil.getOrgIds());} else {checkAuthSql = authValidatorModel.getAuthFiledFilter().getAuthSqlEq(id, UserUtil.getUserId());}return checkAuthSql;}

4.关键对有权限标识注解的权限拦截


@Aspect
@Order(1)
@Component
public class AuchCheckAspect {protected final Log logger = LogFactory.getLog(AuchCheckAspect.class);@AutowiredAuthMapper authMapper;/*** 权限校验** @param joinPoint* @throws Throwable*/@Before(value = "@annotation( com.starmark.auth.anno.AuthCheck)")public void timeAroundAdvice(JoinPoint joinPoint) throws Throwable {//相关参数MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();AuthCheck AuthCheck = method.getAnnotation(AuthCheck.class);String classModel = AuthCheck.classModel().getName();Assert.notNull(classModel, " 权限校验模型不允许为空");Object id = null;Object[] args = joinPoint.getArgs();//从方法中获取相关主键校验参数Parameter[] parameters = method.getParameters();for (int i = 0; i < parameters.length; i++) {AuthParam authParam = parameters[i].getAnnotation(AuthParam.class);if (authParam != null) {id = args[i];break;}}AuthValidatorModel authValidatorModel = AuthConfig.get(classModel);String checkAuthSql = AuthValidatorUtil.getAuthModelSql(classModel,id,AuthCheck.isIn());if (StringUtils.isNotEmpty(checkAuthSql)) {boolean isAuth = authMapper.isAuth(checkAuthSql);if (!isAuth) {throw new AuthCheckException();}}}}

这里提示一下,AuthMapper是我们执行一条生成的SQL方法,是注入一条SQL,因为SQL是我们后台代码生成的,无须考虑SQL注入的问题

    <!-- 生成 SQL判断有没有权限--><select id="isAuth"  resultType="boolean" >${authSql}</select>

5.相关权限的功能使用

@GetMapping(value = "/{id}")@AuthCheck(classModel = SysAuthRole.class)public Object get(@PathVariable("id") @AuthParam Long id) {return sysAuthRoleService.get(id);}

6.测试:
打开有权限的记录,正常结果如下:

有权限记录.png

打开没有权限的记录,抛出一个无权限的异常。

无权限记录.png

至此,单条记录的权限拦截已完成!

个人代码已经完成,如需要请打赏后通知我。谢谢.
如果你觉得该文章对你有帮助,麻烦点赞。
欢迎继续查看下篇文章-通用数据级别权限的框架设计与实现(5)-总结与延伸思考

通用数据级别权限的框架设计与实现(4)-单条记录的权限控制相关推荐

  1. 通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤

    查看上篇文章通用数据级别权限的框架设计与实现(2)-数据权限的准备工作,我们开始数据列表的权限过滤. 原理:我们在做过滤列表时,根据用户权限自动注入到相关SQL中,实现相关过滤,如果拥有全部权限,则不 ...

  2. 痞子衡嵌入式:嵌入式里通用微秒(microseconds)计时函数框架设计与实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里通用微秒(microseconds)计时函数框架设计与实现. 在嵌入式软件开发里,计时可以说是非常基础的功能模块了,其应用也非常 ...

  3. ssm通用数据展示系统 毕业设计-附源码200934

    SSM通用数据展示系统的设计与实现 摘 要 随着社会信息化的日益加强,传统的数据处理系统存在专用性太强.安全性不高.数据共享性差等缺陷,不利于企业应用.为了充分利用企业信息资产所带来的优势,企业迫切需 ...

  4. 这可能是史上功能最全的Java权限认证框架!

    点击关注公众号,Java干货及时送达 今天给大家推荐的这个开源项目超级棒,可能是史上功能最全的 Java 权限认证框架! 这个开源项目就是:sa-token . Sa-Token是什么? sa-tok ...

  5. Spring Security太复杂?试试这个轻量、强大、优雅的权限认证框架!

    各位程序猿小伙伴们,中秋快乐~在节日欢快的气氛中大家是不是还在奋笔疾书.沉浸在学习的海洋中呢? 小编这两天休息在家一直在想一个问题,那就是我们在开发SpringBoot项目的时候,该怎么做好权限认证呢 ...

  6. .NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程

    写在前面 这篇我们对用户权限进行极简设计并保留其扩展性.首先很感谢大家的阅读,前面六章我带着大家快速入门了ASP.NET Core.ASP.NET Core的启动过程源码解析及配置文件的加载过程源码解 ...

  7. SpringBoot集成权限认证框架(Sa-Token)

    SpringBoot集成权限认证框架(Sa-Token) 介绍 身份验证又称"验证"."鉴权",是指通过一定的手段,完成对用户身份的确认. 身份验证的目的是确认 ...

  8. 滴滴青桔单车跨端技术方案和业务技术架构,及框架设计和性能提升实践

    导读:经过将近两年的发展,小程序已经深入用户的日常生活,小程序应用数量超过了百万量级,覆盖众多细分行业,日活用户达到两个亿.青桔单车是日活相对较高的小程序,这也要求我们对小程序的性能.稳定性及安全有较 ...

  9. 这可能是史上功能最全的 Java 权限认证框架!

    点击关注公众号,回复"1024"获取2TB学习资源! 今天给大家推荐的这个开源项目超级棒,可能是史上功能最全的 Java 权限认证框架! Sa-Token 介绍 Sa-Token是 ...

最新文章

  1. 给博客增加了一个主题Nautica02Liquid
  2. Spring集成MyBatis完整示例
  3. WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX
  4. 深入浅出WPF开发下载
  5. 全球范围快速成长未来十年是SaaS发展的黄金时期
  6. 获取字符串内双引号中的所有内容
  7. 高斯克吕格投影中有关带号与经度的关系
  8. 层次分析与一致性检验
  9. Swagger使用方法
  10. 多个路由器无线桥接,共享网络
  11. 商场三十六计——第5计 “趁火打劫”
  12. 读取ntfs的usn
  13. 一毕业就上了艘“火箭”,这群校招生在大公司创业
  14. Matlab:FIR滤波器设计和音频信号滤波去噪
  15. 单片机 TM4C123GXL 学习 例程
  16. 越来越多动物正在灭绝,“AI+动物”能否改变这一局面?
  17. Istio服务网格进阶①:Istio服务网格核心理论概念
  18. 第15讲:Python列表对象的反转与排序
  19. NI Linux实时设备上升级固件
  20. 动态规划(分梨、最长公共子序列)

热门文章

  1. 2021年10个激动人心的工程里程碑
  2. 【科普】AI的分类与演进
  3. 科学家发现新的人类脑细胞,或可解答一个难题
  4. 刚刚,特斯拉宣布终止私有化,马斯克最终没能说服大股东
  5. 机器人3·15 | 赛迪「机器人国评中心」揭示机器人产品质量6大痛点!
  6. 新基建来势汹汹,开发者如何捍卫其安全?
  7. CPU 有个禁区,内核权限也无法进入!
  8. Jmeter(一)http接口添加header和cookie --转载
  9. 【mysql学习笔记整理】
  10. 第174天:面向对象——公有属性、私有属性和静态属性