使用`注解`+`AOP`来完成用户权限验证(智能协同云图库项目)

使用注解+AOP来完成用户权限验证(智能协同云图库项目)

前置知识

  • @annotation(authCheck) : 表示在只拦截方法上有@AuthCheck标注的方法
    • @annotation()是一个切入点匹配器
  • RequestContextHolder.currentRequestAttributes()通过RequestContextHolder通用的全局上下文属性的,currentRequestAttributes()方法可以拿到当前请求的所有属性
  • RequestAttributes 直接拿不到当前的请求,所以需要强转为 ServletRequestAttributes,用强转后的对象拿请求

代码

注解:

java
复制代码
/** * 判断用户权限的注解 * @author 闲云 * @version 1.0 **/@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AuthCheck { /** * 必须要有用户角色 * @return */ String mustRole() default ""; }

AOP代码:

java
复制代码
/* 1. 注解+AOP实现用户权限控制的思路: 2. 自定义一个权限注解,注解的值为用户角色(不同用户角色对应不同权限) 3. 在需要权限才能执行的方法上加上该注解,并指定对应的角色 4. 在切面拦截方法中实现用户权限校验: 1. 获取当前登录用户(可以通过 RequestContextHolder.current() 获取当前所有的请求属性) 1. 需要用 ServletRequestAttributes 强转一下才能拿到当前的请求 2. 获取当前方法上注解的权限角色 3. 判断当前登录用户是否具有该权限 (这里用户权限用的是枚举,所以比较是应该注意是枚举类型相互比较) 4. 如果没有权限,则抛出异常 5. 如果有权限,则执行方法 */ @Aspect @Component public class AuthInterception { @Resource private UserService userService; /** * 切面拦截方法,判断用户权限 * * @return */ // @annotation(authCheck) : 表示在只拦截方法上有AuthCheck注解的方法 // @annotation()是一个切入点匹配器 @Around("@annotation(authCheck)") public Object doInterception(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable { String mustRole = authCheck.mustRole();//被 @AuthCheck 注解的方法,必须具有mustRole角色 //通过通用的全局上下文,获取当前请求的所有属性 RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); /* RequestAttributes 直接拿不到当前的请求,所以需要强转为 ServletRequestAttributes */ HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); //获取当前登录用户 User loginUser = userService.getLoginUser(request); //这里用户权限用的是枚举,所以比较是应该注意是枚举类型相互比较 UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole); //如果该方法不需要权限,则直接执行 if (mustRoleEnum == null) { return joinPoint.proceed(); } //以下的代码必须有权限才会执行的方法 UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole()); if (userRoleEnum == null) {//如果用户没有角色,则抛出异常(角色的不同,系统权限也不同) throw new BusinessException(ErrorCode.NO_AUTH_ERROR); } //必须要有管理员权限才能执行的方法,但用户没有管理员权限 if (UserRoleEnum.ADMIN.equals(mustRoleEnum) && !UserRoleEnum.ADMIN.equals(userRoleEnum)) { throw new BusinessException(ErrorCode.NO_AUTH_ERROR); } //执行的方法需要管理员权限,用户也有管理员权限,则执行方法 return joinPoint.proceed(); } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友8621
作者分享
# 毕业一年,失业半年,三份劳动合同 毕业前一年,一边在教室尽自己最大的耐力学习,一边焦虑着自己的竞争力,不停怀疑自己。总觉得自己比起其他人很差劲,知识深度浅,面窄。一直焦虑,一直没敢付诸行动,做事束手束脚。到了去年八月末,在近期面试三四家的情况下,糊里糊涂进了公司,还没入职,就已经从制度,福利,公司气氛,业务中感受到了各种不舒服(入职a,与b签合同,在c打卡),入职第一周,就已经想离职了。但我更害怕出来找不到工作,于是硬着头皮待了下去。中间又签署了一份劳动合同,从b改签到了a。最后由于种种事情累加在一起,我终于下定决心离职。离职期间有过玩乐,逃避,重新面试,挫败,幸运,遗憾,无所谓,随缘。期间也明白了在资源和硬实力拉不开差距时,时势造就英雄。目前随缘到了第三份劳动合同跟前,目前来说,这次的工作非常符合我去年对工作的期望的。总感觉自己实际生活的发展晚同辈人一步。学前班升一年级,我留级;高考,我复读;进路局,我升本;初入社会,我焦虑踌躇。
5
Java智慧水利这个方向发展如何呢?公司背景是中核和其他几个民营企业合资的,规模99到20人。里面百分之八十是中年人。
2
25届专升本在北京的低代码公司工作
3
25届无实习经历,现在该怎么办呢?😵我是专升本
4
通过锁和事务实现一个用户创建一个空间(智能协同云图库——空间模块)
5
下载 APP