通用数据级别权限的框架设计与实现(4)-单条记录的权限控制
查看上篇文章通用数据级别权限的框架设计与实现(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.测试:
打开有权限的记录,正常结果如下:
打开没有权限的记录,抛出一个无权限的异常。
至此,单条记录的权限拦截已完成!
个人代码已经完成,如需要请打赏后通知我。谢谢.
如果你觉得该文章对你有帮助,麻烦点赞。
欢迎继续查看下篇文章-通用数据级别权限的框架设计与实现(5)-总结与延伸思考
通用数据级别权限的框架设计与实现(4)-单条记录的权限控制相关推荐
- 通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤
查看上篇文章通用数据级别权限的框架设计与实现(2)-数据权限的准备工作,我们开始数据列表的权限过滤. 原理:我们在做过滤列表时,根据用户权限自动注入到相关SQL中,实现相关过滤,如果拥有全部权限,则不 ...
- 痞子衡嵌入式:嵌入式里通用微秒(microseconds)计时函数框架设计与实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里通用微秒(microseconds)计时函数框架设计与实现. 在嵌入式软件开发里,计时可以说是非常基础的功能模块了,其应用也非常 ...
- ssm通用数据展示系统 毕业设计-附源码200934
SSM通用数据展示系统的设计与实现 摘 要 随着社会信息化的日益加强,传统的数据处理系统存在专用性太强.安全性不高.数据共享性差等缺陷,不利于企业应用.为了充分利用企业信息资产所带来的优势,企业迫切需 ...
- 这可能是史上功能最全的Java权限认证框架!
点击关注公众号,Java干货及时送达 今天给大家推荐的这个开源项目超级棒,可能是史上功能最全的 Java 权限认证框架! 这个开源项目就是:sa-token . Sa-Token是什么? sa-tok ...
- Spring Security太复杂?试试这个轻量、强大、优雅的权限认证框架!
各位程序猿小伙伴们,中秋快乐~在节日欢快的气氛中大家是不是还在奋笔疾书.沉浸在学习的海洋中呢? 小编这两天休息在家一直在想一个问题,那就是我们在开发SpringBoot项目的时候,该怎么做好权限认证呢 ...
- .NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程
写在前面 这篇我们对用户权限进行极简设计并保留其扩展性.首先很感谢大家的阅读,前面六章我带着大家快速入门了ASP.NET Core.ASP.NET Core的启动过程源码解析及配置文件的加载过程源码解 ...
- SpringBoot集成权限认证框架(Sa-Token)
SpringBoot集成权限认证框架(Sa-Token) 介绍 身份验证又称"验证"."鉴权",是指通过一定的手段,完成对用户身份的确认. 身份验证的目的是确认 ...
- 滴滴青桔单车跨端技术方案和业务技术架构,及框架设计和性能提升实践
导读:经过将近两年的发展,小程序已经深入用户的日常生活,小程序应用数量超过了百万量级,覆盖众多细分行业,日活用户达到两个亿.青桔单车是日活相对较高的小程序,这也要求我们对小程序的性能.稳定性及安全有较 ...
- 这可能是史上功能最全的 Java 权限认证框架!
点击关注公众号,回复"1024"获取2TB学习资源! 今天给大家推荐的这个开源项目超级棒,可能是史上功能最全的 Java 权限认证框架! Sa-Token 介绍 Sa-Token是 ...
最新文章
- 给博客增加了一个主题Nautica02Liquid
- Spring集成MyBatis完整示例
- WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX
- 深入浅出WPF开发下载
- 全球范围快速成长未来十年是SaaS发展的黄金时期
- 获取字符串内双引号中的所有内容
- 高斯克吕格投影中有关带号与经度的关系
- 层次分析与一致性检验
- Swagger使用方法
- 多个路由器无线桥接,共享网络
- 商场三十六计——第5计 “趁火打劫”
- 读取ntfs的usn
- 一毕业就上了艘“火箭”,这群校招生在大公司创业
- Matlab:FIR滤波器设计和音频信号滤波去噪
- 单片机 TM4C123GXL 学习 例程
- 越来越多动物正在灭绝,“AI+动物”能否改变这一局面?
- Istio服务网格进阶①:Istio服务网格核心理论概念
- 第15讲:Python列表对象的反转与排序
- NI Linux实时设备上升级固件
- 动态规划(分梨、最长公共子序列)