IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 一分钟搞定Spring AOP实现权限控制 -> 正文阅读

[Java知识库]一分钟搞定Spring AOP实现权限控制

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 {

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private 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");
        
        //获取角色id
        List<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);
        }
        
        //获取请求的url
        String 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等等,里面很多功能还有待挖掘…

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:28:00  更:2021-08-12 16:29:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/4 6:37:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码