使用`注解`+`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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
学习完智能协同云图库项目后,想改造成springcloudalibaba架构的微服务项目,微服务划分如下:依赖服务:- 注册中心与配置中心: Nacos(负责服务注册发现以及各服务的动态配置管理)- 微服务网关(yunpic-backend-gateway): Gateway 聚合所有接口,统一接收处理前端请求,负责路由转发、鉴权与限流公共模块:- common 公共模块(yunpic-backe
4
云图库-以图搜图失效解决
7
个人博客
4
我在做云图库项目到部署上线阶段时,前后端已经成功部署到宝塔云上,我也能成功通过我的域名正常访问云图库,注册新账户也是注册成功且远程数据库也有信息,但是用已有的账号登录总是显示系统错误。我看了下我的redis密码正确且服务是正常运行请问有人遇到过同样的问题吗?
3
智能协同云图库-进入编辑报错解决
4
作者分享
# 毕业一年,失业半年,三份劳动合同
毕业前一年,一边在教室尽自己最大的耐力学习,一边焦虑着自己的竞争力,不停怀疑自己。总觉得自己比起其他人很差劲,知识深度浅,面窄。一直焦虑,一直没敢付诸行动,做事束手束脚。到了去年八月末,在近期面试三四家的情况下,糊里糊涂进了公司,还没入职,就已经从制度,福利,公司气氛,业务中感受到了各种不舒服(入职a,与b签合同,在c打卡),入职第一周,就已经想离职了。但我更害怕出来找不到工作,于是硬着头皮待了下去。中间又签署了一份劳动合同,从b改签到了a。最后由于种种事情累加在一起,我终于下定决心离职。离职期间有过玩乐,逃避,重新面试,挫败,幸运,遗憾,无所谓,随缘。期间也明白了在资源和硬实力拉不开差距时,时势造就英雄。目前随缘到了第三份劳动合同跟前,目前来说,这次的工作非常符合我去年对工作的期望的。总感觉自己实际生活的发展晚同辈人一步。学前班升一年级,我留级;高考,我复读;进路局,我升本;初入社会,我焦虑踌躇。
5
Java智慧水利这个方向发展如何呢?公司背景是中核和其他几个民营企业合资的,规模99到20人。里面百分之八十是中年人。
2
25届专升本在北京的低代码公司工作
3
25届无实习经历,现在该怎么办呢?😵我是专升本
4
通过锁和事务实现一个用户创建一个空间(智能协同云图库——空间模块)
5
