《权限系列》----用SpringAop控制权限二

2024-08-27 20:38
文章标签 系列 控制 权限 springaop

本文主要是介绍《权限系列》----用SpringAop控制权限二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  • 接着上一篇博客说,上一篇文章已经将大部分代码贴出来了,下面该轮到核心代码了,Spring Aop的切面代码。

项目源码

点击这里,到github上下载项目的源码

切面代码

public class PermissionAspect {@Resource
private CheckAuthorityService checkAuthorityService;public void doBefore(JoinPoint jp) throws IOException{Method soruceMethod = getSourceMethod(jp);if(soruceMethod!=null){ValidatePermission oper = soruceMethod.getAnnotation(ValidatePermission.class);if (oper != null) {String flag= oper.authority();Object[] args = jp.getArgs();HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpSession session =request.getSession(); boolean status = checkAuthorityService.checkAccess(flag,session);if(status){return ;//正常}else{throw new AccessDeniedException("无权操作该功能!");}}}
}private Method getSourceMethod(JoinPoint jp){Method proxyMethod = ((MethodSignature) jp.getSignature()).getMethod();try {return jp.getTarget().getClass().getMethod(proxyMethod.getName(), proxyMethod.getParameterTypes());} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}return null;}
}
  • 在切面中,我们利用反射,将请求方法上的注解拿到,然后读取此注解中的权限信息,最后将注解信息和session作为参数一块传入到checkAccess()方法中检查权限,下面是要访问的Controller中的方法。

要访问的目标方法

@ValidatePermission(authority="create")
@RequestMapping("/create")
@ResponseBody
public List<String> createUser(){userService.addUser(null);List<String> list=Arrays.asList("新增用户信息成功");return list;
}

检查权限

public class CheckAuthorityServiceImpl implements CheckAuthorityService {@Resourceprivate PermissionMapper permissionMapper;@Resourceprivate JedisClient jedisClient;public Map<String, String> authorityMap = null;@Overridepublic boolean checkAccess(String flag, HttpSession session) {String desUrl="";boolean desFlag=false;//在session中获取登录名String loginName = (String) session.getAttribute("userLoginName");//在session中获取用户角色IDInteger roleID= (Integer) session.getAttribute("roleID");String ROLE_ID_MAP="ROLEID_PERMISSION:"+roleID.toString()+"_"+"MAP";//在redis中查找存放资源的map,若map存在,则通过目标资源获取authorityMap=jedisClient.hgetAll(ROLE_ID_MAP);if (authorityMap!=null && authorityMap.size()>0){//匹配资源 这是的时间复杂度大约为O(1)desUrl=authorityMap.get(flag);}else {//若存放资源的map不存在,在数据库中将资源搜出来,放入map中,这时候map的key就是资源(Url)value 是1 目的是省内存List<String> list = permissionMapper.getPermissions(loginName);if (list != null && list.size() > 0) {for (String str : list) {authorityMap.put(str,"1");}//匹配资源 这是的时间复杂度大约为O(1)desUrl=authorityMap.get(flag);//将map放入redis中jedisClient.hmset(ROLE_ID_MAP,authorityMap);}}//判断资源是否匹配成功if (StringUtils.isNoneBlank(desUrl)){desFlag=true;}return desFlag;}
}
  • 在小编做的项目中,用户是可以不断增加角色的,也就是说角色是变化的,因为不同的角色对应着不同的资源,所以在检查用户权限的时候,小编将资源信息存入一个HashMap中,然后叫此HashMap放入Redis中,当每次判断权限时,我们根据用户的角色ID将map从redis中取出来,然后根据目标资源去map中get(),这样以来,get()的时间复杂度是O(1),提高效率。

小结

  • 置于redis的使用,请见第三篇博客。

这篇关于《权限系列》----用SpringAop控制权限二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112720

相关文章

kingbase修改权限实现方式

《kingbase修改权限实现方式》该文章详细介绍了如何在数据库中创建用户并赋予其相应的权限,包括创建用户、回收默认权限、创建数据库、赋权数据库权限、创建只读用户以及回收权限等步骤... 目录前言使用步骤总结前言创建用户后对数据库对象的读写权限进行修改使用步骤1、创建用户create user cs

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺