思路:
根据自定义注解,给对应权限能够查看到的资源的Controller方法上添加注解(也就是一个权限字符串),权限字符串跟方法是一对多的关系,同一个权限字符串可以添加到多个方法上;当用户有对应的权限时才能查看对应的资源;
所以我们可以获取到用户所拥有的所有权限字符串集合(登录时获取到,放入令牌池) & 当前所访问的方法对应的权限字符串(反射动态获取方法上的注解) => 判断集合中是否有这一个

创建一个anno包,包里创建PreAuth,注意PreAuth是Annotation类型的,PreAuth是用来写自定义注解的

/*** @Author liu-miss* @Description //权限校验注解* @Date l 2021/8/19**/@Target({ElementType.METHOD})      //该注解可以作用到哪些类型元素上:有,ElementType.METHOD(方法)、ElementType.TYPE(类)、字段;若是ElementType.METHOD(方法),则只能加在方法上
@Retention(RetentionPolicy.RUNTIME)   //运行时生效public @interface PreAuth {/*** @Author liu-miss* @Description //权限字符串* @Date l 2021/8/19**/String value() default "";}

需要在实体类中加一个存放权限字符串的集合 private List authList =》 用来存放权限字符串,并加上相应的 get 和 set 方法

private List<String> authList;public List<String> getAuthList() {return authList;
}public void setAuthList(List<String> authList) {this.authList = authList;
}

我们需要写一个根据用户id添加权限字符串的方法,存放到权限字符串集合中
Service层:

List<String> listAuthListByuserId(Long userId);

对应的实现方法ServiceImpl层:

@Override
public List<String> listAuthListByuserId(Long userId) {/***  多对多查询*  用户id ->  用户-角色的多对多关联表  -> 角色  ->  角色和菜单的多对多关联表 ->  菜单 -> 权限字符串*/List<String> authList = new ArrayList<>();//添加user:view的权限字符串,权限字符串为user:view的都可以访问到authList.add("user:view");return authList;
}

接下来就应该在拦截器中进行验证了
利用反射,获取目标方法的注解,利用获取到的注解判断用户是否有这个权限去访问

// 接收访问的目标方法信息
HandlerMethod handlerMethod = (HandlerMethod)handler;
// 获取目标方法上的指定注解
PreAuth preAuth = handlerMethod.getMethodAnnotation(PreAuth.class);
System.out.println("当前方法的权限字符串为:"+preAuth);
if(preAuth == null){// 不需要验证权限return true;
}
// 判断用户是否拥有该方法的访问权限
List<String> authList = user.getAuthList();
if(!authList.contains(preAuth.value())){System.err.println("权限验证失败!");// 没有,返回falsereturn false;
}
// 当返回true的时候,验证成功,可以继续向下执行,访问目标方法
return true;

在能使用这个权限字符串访问到的Controller层方法中加上@PreAuth(“user:view”)即可访问到

在Postman中测试:
有权限:

如果没有权限:

利用自定义注解实现权限验证相关推荐

  1. 自定义注解实现权限校验含义_厉害了!老大利用AOP实现自定义注解,半小时完成我三天工作量...

    前面我们已经介绍了AOP适用的一些业务场景以及简单的代码实现,当时我们的切点是用execution表达式来配置的,这种方式有一些局限性在里面: 灵活性不高,一个表达式只能切到某种同类型的方法 个性化不 ...

  2. 如何利用自定义注解放行 Spring Security 项目的接口

    在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...

  3. 自定义注解做数据验证

    为了工作也为了更加深入了解掌握java注解的使用,决定自定义注解来实现数据验证. 最开始也考虑使用jsr-303规范来实现功能,但是对于开发人员来说比较累,因为要去实体类对象中添加验证字段注解,而且要 ...

  4. ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存

    基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...

  5. SpringBoot中利用自定义注解优雅地实现隐私数据脱敏(加密显示)

    前言 这两天在整改等保测出的问题,里面有一个"用户信息泄露"的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏. 数据脱敏:把系统里的一些敏感数据 ...

  6. asp.net mvc 实现自定义AuthorizeAttribute(权限验证)标签 无效的一种原因

    ApiController下的授权筛选attribute为System.Web.Http.AuthorizeAttribute 普通Controller用的是System.Web.Mvc.Author ...

  7. java自定义注解实现

    引言 去杭州第一次面试的时候问及到自定义注解,那时候不清楚,现在简单写下,算是对过去的一个交代. 自定义注解 关于注解的定义这里就不解释了,自定义注解的场景有很多,比如登录.权限拦截.日志.以及各种框 ...

  8. 自定义注解实现RBAC权限校验,不要再说你不会了

    目录 1.前言 2.实现思路 3.编码实战 3.1.准备 3.2.数据库表准备 3.3.自定义注解 3.4.拦截器 3.5.接口使用 3.6.测试 3.7.结论 4.结束语 1.前言 学过Spring ...

  9. 干货,springboot自定义注解实现分布式锁详解

    背景 在互联网的很多场景下,会产生资源竞争,如果是单机环境,简单加个锁就能解决问题:但是在集群环境下(分布式环境),多个客户端在一个很短的时间内竞争同一服务端资源(如抢购场景),或者同一客户端重复提交 ...

最新文章

  1. Lucene默认的打分算法——ES默认
  2. UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time
  3. Oracle 用拼接字符串更新表 测试
  4. Nginx负载均衡、ssl原理,生成ssl密钥对,配置Nginxssl
  5. iOS开发之openURL:(打电话,打开网页等)
  6. AndroidDeveloper Weekly NO.4
  7. 大篆汉字对照表_甲骨文汉字对照表大全_甲骨文数字象形字对照图
  8. OCP考试题库(精准无比)
  9. 进程调度算法(c语言)
  10. 锚杆拉拔试验弹性模量计算_锚杆拉拔试验检测标准
  11. Python获取打印机读数(东芝泰格)
  12. k2路由器改无线打印服务器,修改斐讯K2、K3路由器的无线密码【图解】
  13. codeforce 595A
  14. 链桨PaddleDTX系列 - xdb源码分析(一)
  15. c语言课题程序框图,C语言图形五子棋课程设计报告带流程图.docx
  16. beamer制作学术slide
  17. Adobe Photoshop CC 2017图文安装教程,附下载地址
  18. Laravel Eloquent 关联
  19. 网络空间资产测绘小结2
  20. LTE网络PRACH参数规划

热门文章

  1. ssh user@host command 与login host运行shell的区别
  2. IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
  3. 创建最原始的XMLHttprequest对象
  4. linux shell 特殊符号的表示
  5. ffmpeg输出yuv的函数堆栈(h264)
  6. Flink-keySet方法
  7. 读取 配置文件_自动化测试中,如何读取配置文件内容?
  8. div横向滚动条_14. Selenium 处理滚动条
  9. mysql 查看连接_怎么实时查看mysql当前连接数
  10. 字符流Reader和Writer