如何利用AOP实现权限校验

背景

最近在写项目的时候因为前期需求没有说要建立权限系统,用户与角色,角色与权限之间互相绑定,但是到项目中后期,突然提出要分权,这时候如果推到重来的话就很麻烦,如何重新对数据库的表进行设计,相关代码也要重新编写,于是想到使用AOP直接对用户权限进行校验。 笔者是一名大三学生,代码出现问题还请各位指正,笔者不胜感激。

确定切面

首先我们要进行权限验证的接口一定是很多的,如果直接硬编码去实现的话代码的复用性不高且后期难以维护,所以在每次进接口之前先进行权限验证似乎是一个非常好的方式。

编写权限注解

Java 复制代码
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionAnnotation {

}

注解的作用就是帮助我们确定到底哪一个方法需要进行权限验证。

定义切面

java 复制代码
@Aspect
@Component
@Order(1)
public class PermissionFirstAdvice {

    // 定义一个切面,括号内写入前面自定义注解的路径
    @Pointcut("@annotation(com.mu.demo.annotation.PermissionAnnotation)")
    private void permissionCheck() {
    }

    @Around("permissionCheck()")
    public Object permissionCheckFirst(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("---进入aopAround通知---");
        //因为在登录之后会将用户信息存入缓存当中
        //从缓存中获取登录者信息
        Optional<SysUser> userOptional = Optional.ofNullable(LoginHelper.getLoginUser());
        if(userIdOptional.isPresent()) {
            SysUser sysUser = userOptional.get();
            //获取角色id
            List<Long> roleIds = sysUser.getRoleIds();
            Set<String> powerStringSet = new HashSet<>();
            for (Long roleId : roleIds) {
                //获取角色所对应的权限字符串
                //权限字符串和访问路径相同,例如查询权限:user::listPage,删除权限:user::delete等等...
                //这里可以优化为直接从缓存当中获取,可以节省很多时间个资源
                List<String> powerString = sysRoleService.getPowerString(roleId);

                //因为权限字符串可能重复,所以用Set集合保存起来
                powerStringSet.addAll(powerString);
            }

            //获取请求的url
            String url = request.getRequestURI();
            log.info("===开始进行权限校验===");
            if (!powerStringSet.contains(url)) {
                return ResultJson.error("权限不足");
            }

            return joinPoint.proceed();
        }else {
            return ResultJson.error("用户未登录");
        }
    }
}

到此以一个简单的权限校验逻辑就写好了。

相关推荐
明月_清风3 小时前
Muse 登顶 App Store 第一,SDK 直接开源:AI Agent 开始进入下一个阶段
人工智能·后端
hsfxuebao6 小时前
Loop Engineering 保姆级教程 + 项目实战
人工智能·后端
打工仔折腾 AI6 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
架构技术专栏6 小时前
交叉熵:AI 怎样给概率预测打分
后端
code_slave(码畜)7 小时前
微服务架构落地:基础服务 —— 报表服务(中篇:元数据、查询引擎、缓存与权限落地)
spring boot·spring cloud·缓存·微服务·架构
ZealSinger8 小时前
Boot4挂起函数丢traceId怎么修
spring boot·kotlin·协程·可观测性
IT_陈寒8 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
code_slave(码畜)8 小时前
微服务架构落地:基础服务 —— 报表服务(AI 集成篇:AI 增强报表能力)
人工智能·spring boot·spring cloud·微服务·架构
要努力啊4698 小时前
用 Codex 加速 Java 开发:从代码生成到测试覆盖的完整实战
后端
dora8 小时前
LangChain4j 新手入门实战教程(Java版)
后端·langchain·agent