利用自定义注解实现权限验证
思路:
根据自定义注解,给对应权限能够查看到的资源的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中测试:
有权限:
如果没有权限:
利用自定义注解实现权限验证相关推荐
- 自定义注解实现权限校验含义_厉害了!老大利用AOP实现自定义注解,半小时完成我三天工作量...
前面我们已经介绍了AOP适用的一些业务场景以及简单的代码实现,当时我们的切点是用execution表达式来配置的,这种方式有一些局限性在里面: 灵活性不高,一个表达式只能切到某种同类型的方法 个性化不 ...
- 如何利用自定义注解放行 Spring Security 项目的接口
在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...
- 自定义注解做数据验证
为了工作也为了更加深入了解掌握java注解的使用,决定自定义注解来实现数据验证. 最开始也考虑使用jsr-303规范来实现功能,但是对于开发人员来说比较累,因为要去实体类对象中添加验证字段注解,而且要 ...
- ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...
- SpringBoot中利用自定义注解优雅地实现隐私数据脱敏(加密显示)
前言 这两天在整改等保测出的问题,里面有一个"用户信息泄露"的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏. 数据脱敏:把系统里的一些敏感数据 ...
- asp.net mvc 实现自定义AuthorizeAttribute(权限验证)标签 无效的一种原因
ApiController下的授权筛选attribute为System.Web.Http.AuthorizeAttribute 普通Controller用的是System.Web.Mvc.Author ...
- java自定义注解实现
引言 去杭州第一次面试的时候问及到自定义注解,那时候不清楚,现在简单写下,算是对过去的一个交代. 自定义注解 关于注解的定义这里就不解释了,自定义注解的场景有很多,比如登录.权限拦截.日志.以及各种框 ...
- 自定义注解实现RBAC权限校验,不要再说你不会了
目录 1.前言 2.实现思路 3.编码实战 3.1.准备 3.2.数据库表准备 3.3.自定义注解 3.4.拦截器 3.5.接口使用 3.6.测试 3.7.结论 4.结束语 1.前言 学过Spring ...
- 干货,springboot自定义注解实现分布式锁详解
背景 在互联网的很多场景下,会产生资源竞争,如果是单机环境,简单加个锁就能解决问题:但是在集群环境下(分布式环境),多个客户端在一个很短的时间内竞争同一服务端资源(如抢购场景),或者同一客户端重复提交 ...
最新文章
- Lucene默认的打分算法——ES默认
- UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time
- Oracle 用拼接字符串更新表 测试
- Nginx负载均衡、ssl原理,生成ssl密钥对,配置Nginxssl
- iOS开发之openURL:(打电话,打开网页等)
- AndroidDeveloper Weekly NO.4
- 大篆汉字对照表_甲骨文汉字对照表大全_甲骨文数字象形字对照图
- OCP考试题库(精准无比)
- 进程调度算法(c语言)
- 锚杆拉拔试验弹性模量计算_锚杆拉拔试验检测标准
- Python获取打印机读数(东芝泰格)
- k2路由器改无线打印服务器,修改斐讯K2、K3路由器的无线密码【图解】
- codeforce 595A
- 链桨PaddleDTX系列 - xdb源码分析(一)
- c语言课题程序框图,C语言图形五子棋课程设计报告带流程图.docx
- beamer制作学术slide
- Adobe Photoshop CC 2017图文安装教程,附下载地址
- Laravel Eloquent 关联
- 网络空间资产测绘小结2
- LTE网络PRACH参数规划
热门文章
- ssh user@host command 与login host运行shell的区别
- IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
- 创建最原始的XMLHttprequest对象
- linux shell 特殊符号的表示
- ffmpeg输出yuv的函数堆栈(h264)
- Flink-keySet方法
- 读取 配置文件_自动化测试中,如何读取配置文件内容?
- div横向滚动条_14. Selenium 处理滚动条
- mysql 查看连接_怎么实时查看mysql当前连接数
- 字符流Reader和Writer