Spring Aop就是我们常说的面向切面编程,它和IOC构成了spring体系的两大核心,玩明白了这两个,spring就算玩会了。。
spring aop可以干很多事,他就类似于拦截器,能在你的目标方法之前或者之后做一些事儿(类似于方法的增强),例如:权限校验、日志记录、统计等

本文主要讲的是如何利用spring aop实现权限校验和控制

一、首先定义接口(有点spring security那意思了)

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authority {}

二、定义切面

我们的权限控制是根据RBAC模型进行的,也就是说一个用户对应多个角色,已经角色对应多种权限,基于这个模型,以下代码就是大体思路

@Slf4j
@Aspect
@Component
public class AnnotationAopTwo {@Autowiredprivate HttpServletRequest request;@Autowiredprivate RedisUtil redisUtil;@Autowiredprivate SysRoleService sysRoleService;@Pointcut("@annotation(com.qcby.device.manage.annotation.Authority)")public void viewRecordsPoinCut(){}@Around("viewRecordsPoinCut()")public Object Annotation(ProceedingJoinPoint joinPoint) throws Throwable{log.info("---进入aopAround通知---");//因为在登录之后会将用户信息存入缓存当中//从缓存中获取登录者信息SysUser sysUser = redisUtil.get("SysUser");//获取角色idList<Long> roleIds =  sysUser.getRoleIds();Set<String> powerStringSet = new HashSet<>();for (Long roleId : roleIds) {//获取角色所对应的权限字符串//权限字符串和访问路径相同,例如查询权限:/rest/user/listPage,删除权限:/rest/user/delete等等...//这里可以优化为直接从缓存当中获取,可以节省很多时间个资源List<String> powerString = sysRoleService.getPowerString(roleId);//因为权限字符串可能重复,所以用Set集合保存起来powerStringSet.addAll(powerString);}//获取请求的urlString url = request.getRequestURI();log.info("===开始进行权限校验===");if(!powerStringSet.contains(url)){return ResultJson.error("权限不足");}return joinPoint.proceed();}
}

上面代码提供了大体思路,其实使用aop实现权限校验逻辑还是很清晰的

  1. 定义接口@Authority
  2. 定义切面和切点,拦截所有添加了@Authority注解的Controller
  3. 定义权限验证的逻辑
    1. 从缓存中获取用户信息
    2. 获取用户的角色id集合
    3. 根据角色id利用Set集合保存起来
    4. 获取请求的路径url
    5. 判断set集合里面有没有该url,如果有则直接返回,,没有就返回权限不足的信息

文章只提供了大致思路和部分代码,还有很多的优化空间,也可以实现类似spring security的功能,自定义@PreAuthorize和属性hasAuthority等等,里面很多功能还有待挖掘…

一分钟搞定Spring AOP实现权限控制相关推荐

  1. 基于Spring AOP实现权限控制

    基于Spring AOP实现一个简单的接口权限 1.定义自定义注解 //注解的作用类型:方法.类 @Target({ElementType.METHOD,ElementType.TYPE}) @Ret ...

  2. 10分钟搞定 Spring 批处理组件 —— spring-batch

    SpringBatch是什么 Spring Batch 是一个轻量级.全面的批处理框架,旨在支持开发对企业系统的日常运营至关重要的健壮批处理应用程序.Spring Batch 建立在人们所期望的 Sp ...

  3. Spring Boot 返回 XML 数据,一分钟搞定!

    2019独角兽企业重金招聘Python工程师标准>>> Spring Boot 返回 XML 数据,前提必须已经搭建了 Spring Boot 项目,所以这一块代码就不贴了,可以点击 ...

  4. JeecgBoot 单体升级微服务快速方案(十分钟搞定)

    JeecgBoot 单体升级微服务方案(十分钟搞定) 当前系统分为system.demo 等模块,现有需求把每个模块单独启动作为微服务应用,故而推出新版boot[20200812beta],支持快速切 ...

  5. 服务器添加管理员隐藏账号,绝招:隐藏管理员账号 三分钟搞定

    绝招:隐藏管理员账号 三分钟搞定 更新时间:2007年07月30日 11:30:59   作者: 对regedit.exe大家都很熟悉,但却不能对注册表的项键设置权限,而regedt32.exe最大的 ...

  6. 三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQL2005版本)

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 转载原文,并注明出处!虽无多少技术含量,毕竟是作者心血原创,希望理解. 转自 http://blog.csdn.net ...

  7. 启程 - 《每日五分钟搞定大数据》

    <每日五分钟搞定大数据>原创系列,每周不定期更新.欢迎关注公众号:大叔据   想了很久,准备开始写一系列的文章,记录这些年来的所得所想,感觉内容比较多不知从哪里开始,画了个思维导图确定了大 ...

  8. python使用教程pandas-十分钟搞定pandas(入门教程)

    本文是对pandas官方网站上<10Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上 ...

  9. 3 分钟搞定 Android Push

    在 Android 上,要实现 Push 功能可没有那么简单! 众所周知的原因是,Android 官方的推送服务 GCM 在国内手机上用不了.所以很多国内的开发者,不得不去使用 AndroidPN 这 ...

最新文章

  1. .NETFramework-Web.Mvc:ActionResult
  2. 使用 labelImg 制作YOLO系列目标检测数据集(.xml文件)
  3. 9、图书修改,删除功能
  4. Acwing第 36 场周赛【完结】
  5. 平稳随机序列的自相关函数和功率谱密度
  6. XenServer 6.5实战系列之三:Prepare for XenServer 6.5
  7. python 如何放心干净的卸载模块
  8. oracle with 查询,oracle with 语句实现递归查询
  9. 30岁前不要在乎的29件事(转载)
  10. oracle if 使用函数,Oracle 常见函数用法
  11. 洛谷 P2257 YY的GCD
  12. secure CRT连接华三、华为模拟器
  13. 步进电机驱动C语言代码,单片机控制步进电机系统(C语言源代码)
  14. html盒子背景图,CSS盒子模型以及背景图
  15. 4399游戏Web前端工程师2021秋招面经
  16. 对于提高团队开会效率的看法
  17. Linux常用命令——screen命令
  18. 蓝桥杯的c语言编译器,第九届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学B组比赛心得(还在更新)...
  19. 20220316_Scanner、匿名对象、Random、ArrayList
  20. R语言计算KS值、绘制KS曲线

热门文章

  1. grafana 简介
  2. 陈天奇等人新作引爆AI界
  3. IOT [02] -- 物联网系统框架介绍
  4. Android窗口 dimiss失效问题 惨痛教训啊
  5. Oracle日期常用函数(SYSDATE)
  6. 【计算机网络】扩展以太网方法总结
  7. 形容词和形容动词活用形的用法
  8. 企业级负载均衡解决方案之八:腾讯云负载均衡解决方案CLB
  9. python父类以及子类
  10. 访问gmail_Gmail中我的联系人在哪里? 快速查找和访问它们。