点关注不迷路,欢迎关注点赞评论!
最近在做一个关于认证与授权的功能模块,需要使用自定义注解完成匿名访问的接口放行功能。想必各位大佬都知道或者了解,springsecurity中三个configure方法
- configure(AuthenticationManagerBuilder auth)
- configure(HttpSecurity http)
- configure(WebSecurity web)
使用web.ignoring().antMatchers()方法;,可以实现不走 Spring Security 过滤器链
1 | java复制代码@Configuration |
一、首先根据官网搭一个基础的环境,加入spring-boot-starter-security和spring-boot-starter-web依赖
修改pom.xml
1 | xml复制代码 <parent> |
二、配置基础的SecurityConfig和WebMvcConfig以及登录页
1 | java复制代码@Configuration |
1 | java复制代码@Configuration |
在templates下添加login.html
1 | html复制代码<!DOCTYPE html> |
三、新建controller测试一把
1 | java复制代码@RestController |
四、访问一下localhost:8080/test和test1接口,可以看到会跳转到登录页,说明我们的接口都是被拦截了的
五、现在我们通过 web.ignoring().antMatchers来把test放行,放行配置如下
1 | java复制代码 @Override |
六、再试下test接口访问,直接访问成功
而test1接口这个时候访问还是需要登录,说明我们的放行配置起到了作用
这个时候我们又要思考了,当项目越来越大,接口越来越多的时候怎么办呢?难道一直改代码?这样的方式恐怕不妥啊!问题不大,我们现在试一试用注解的方式来放行接口!
思路:把所有带这个注解的方法放行了不就行了吗
开始我们的操作
新建一个IgnoreAuth的注解
1 | java复制代码@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上 |
现在有了注解,怎么获取到所有带这个注解的方法呢?
spring提供了RequestMappingHandlerMapping类,可以帮助我们,来获得所有的URL
通过继承(这里就不给大家看源码了,感兴趣的可以自己去看),可以调用getHandlerMethods()来获取
先debug看下获取到的数据是什么样的
1 | java复制代码@Override |
启动项目,看到handlerMethods中包含了key(请求的类型,请求url)value(具体的方法)
那现在有了所有的url方法,我们只需要将带有IgnoreAuth注解方法筛选出来,并且直接放行就行了
1 | java复制代码handlerMethods.forEach((info, method) -> { |
在test方法上打上我们的自定义注解IgnoreAuth
1 | java复制代码 @IgnoreAuth |
写完代码,重启项目,我们再测试下,搞定!
当然,我这里只是其中一种实现方式,有哪儿不足的地方希望大家能在评论中指出来,谢谢大家!
写文真不容易,裂开!
本文转载自: 掘金