就如同静态资源一样,我们不希望请求时需要认证,而是直接返回结果。

接下来我使用自定义注解完成匿名访问(以@AnonymousGetMapping举例)
第一步:我们需要写一个匿名访问的注解@AnonymousGetMapping,其中我们需要此注解也注解上@AnonymousAccess,保证在后续过程中获取匿名访问的url。

@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface AnonymousGetMapping {/*** Alias for {@link RequestMapping#name}.*/@AliasFor(annotation = RequestMapping.class)String name() default "";/*** Alias for {@link RequestMapping#value}.*/@AliasFor(annotation = RequestMapping.class)String[] value() default {};/*** Alias for {@link RequestMapping#path}.*/@AliasFor(annotation = RequestMapping.class)String[] path() default {};/*** Alias for {@link RequestMapping#params}.*/@AliasFor(annotation = RequestMapping.class)String[] params() default {};/*** Alias for {@link RequestMapping#headers}.*/@AliasFor(annotation = RequestMapping.class)String[] headers() default {};/*** Alias for {@link RequestMapping#consumes}.** @since 4.3.5*/@AliasFor(annotation = RequestMapping.class)String[] consumes() default {};/*** Alias for {@link RequestMapping#produces}.*/@AliasFor(annotation = RequestMapping.class)String[] produces() default {};}
/*** @author jacky*  用于标记匿名访问方法*/
@Inherited
@Documented
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnonymousAccess {}

第二步:我们写完这个注解以后将需要完成不拦截的业务逻辑代码。
在我们上一篇博客中提到了继承了WebSecurityConfigurerAdapter的SpringSecurityConfig类,当中我们重写了configure方法,接下来我们只需要获取使用@AnonymousGetMapping 注解的url,将此url加入不拦截的配置当中就可以了。
2.1 获取匿名标记url

 RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping");Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();// 获取匿名标记Map<String, Set<String>> anonymousUrls = getAnonymousUrl(handlerMethodMap);

然后自定义方法获取匿名标记得到url

private Map<String, Set<String>> getAnonymousUrl(Map<RequestMappingInfo, HandlerMethod> handlerMethodMap) {Map<String, Set<String>> anonymousUrls = new HashMap<>(6);Set<String> get = new HashSet<>();Set<String> post = new HashSet<>();Set<String> put = new HashSet<>();Set<String> patch = new HashSet<>();Set<String> delete = new HashSet<>();Set<String> all = new HashSet<>();for (Map.Entry<RequestMappingInfo, HandlerMethod> infoEntry : handlerMethodMap.entrySet()) {HandlerMethod handlerMethod = infoEntry.getValue();AnonymousAccess anonymousAccess = handlerMethod.getMethodAnnotation(AnonymousAccess.class);if (null != anonymousAccess) {List<RequestMethod> requestMethods = new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods());RequestMethodEnum request = RequestMethodEnum.find(requestMethods.size() == 0 ? RequestMethodEnum.ALL.getType() : requestMethods.get(0).name());switch (Objects.requireNonNull(request)) {case GET:get.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());break;case POST:post.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());break;case PUT:put.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());break;case PATCH:patch.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());break;case DELETE:delete.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());break;default:all.addAll(infoEntry.getKey().getPatternsCondition().getPatterns());break;}}}anonymousUrls.put(RequestMethodEnum.GET.getType(), get);anonymousUrls.put(RequestMethodEnum.POST.getType(), post);anonymousUrls.put(RequestMethodEnum.PUT.getType(), put);anonymousUrls.put(RequestMethodEnum.PATCH.getType(), patch);anonymousUrls.put(RequestMethodEnum.DELETE.getType(), delete);anonymousUrls.put(RequestMethodEnum.ALL.getType(), all);return anonymousUrls;}

2.2 在配置中添加不需要验证的请求

.antMatchers(HttpMethod.GET, anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])).permitAll()// POST.antMatchers(HttpMethod.POST, anonymousUrls.get(RequestMethodEnum.POST.getType()).toArray(new String[0])).permitAll()// PUT.antMatchers(HttpMethod.PUT, anonymousUrls.get(RequestMethodEnum.PUT.getType()).toArray(new String[0])).permitAll()// PATCH.antMatchers(HttpMethod.PATCH, anonymousUrls.get(RequestMethodEnum.PATCH.getType()).toArray(new String[0])).permitAll()// DELETE.antMatchers(HttpMethod.DELETE, anonymousUrls.get(RequestMethodEnum.DELETE.getType()).toArray(new String[0])).permitAll()

spring security 实现匿名访问接口相关推荐

  1. Spring Boot集成Ueditor富文本编辑器,实现图片上传,视频上传,返回内容功能并且通过OSS转换为链接并且解决Spring Security静态资源访问以及跨域问题

    学习自https://cloud.tencent.com/developer/article/1452451 现在是晚上22点,刚刚和我们的前端交流完了富文本编辑器的一些意见和看法 还是老样子 需求 ...

  2. 关于spring security没有调用UserDetailsService接口实现类的解决办法

    过程太心酸,也没有报错,security只是拒绝了请求,真是脑袋大,debug了一天,也没看出来哪里出问题了,最后一行一行的看代码找了出来,多了一个重载方法的重写,没有删除,之前以为删除函数内容就行了 ...

  3. Spring Security原理分析

    本文来简单的分析下Spring Security 使用原理.在前面的几节中,已经对 Spring Security 有了一个比较全的使用体验了,这节我们简单的介绍下 Spring Security 基 ...

  4. Spring Security 实战:基于配置的接口角色访问控制

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...

  5. Spring Security 2 配置精讲

    论坛上看了不少Spring Security的相关文章.这些文章基本上都还是基于Acegi-1.X的配置方式,而主要的配置示例也来自于SpringSide的贡献. 众所周知,Spring Securi ...

  6. Spring Security登录用户数据获取(4)

    1. 登录用户数据获取   登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从 ...

  7. Spring Security OAuth2.0认证授权知识概括

    Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...

  8. Spring Security 参考手册(一)

    Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...

  9. spring security技术分享

    Spring Security技术专题 一.初识认证和授权 1.1 认证 1.2 会话 1.3 授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 角色访问控制 1.5.2 资源访问控制 1. ...

最新文章

  1. XXL-JOB v2.0.2,分布式任务调度平台 | 多项特性优化更新
  2. webpack4.x中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
  3. windows内存结构概述
  4. html文件头自动生成,基于infinispan源码包HtmlGenerator代码生成器通过指定头部、标题、底部等进行生成HTML文件...
  5. lambda表达式语法_使用类似Lambda的语法作为Java中的表达式进行切换
  6. c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充
  7. Lucene正则表达式查询RegenxQuery
  8. webstorm两个文件比对_webstorm怎么更改文件名称?或者是重命名
  9. 【房价预测】基于matlab遗传算法优化BP神经网络房价预测【含Matlab源码 592期】
  10. 图形化串口助手Serialplot使用小结
  11. hash冲突的4种解决方案
  12. matlab安卓官方下载,手机matlab软件下载-MATLAB Mobile手机版下载v5.1.0 安卓官方版-单机手游网...
  13. 全志h6对比晶晨s905_一决雌雄!64位芯片晶晨S905对比瑞芯微RK3368谁胜?
  14. python中文分词器(jieba类库)
  15. 移远M26实现短信接收
  16. PLC型号的选择方法
  17. 服务器显示器多少寸合适,购买别冲动!先看多大的显示器适合你
  18. 云服务器是怎么虚拟的,云服务器怎么虚拟化
  19. Python之strip详解
  20. 推荐JSON-handle谷歌插件

热门文章

  1. 挂羊头卖狗肉--代理的二三事
  2. C# ActiveX控件开发_1494
  3. 无线通信:多址接入技术
  4. 2021广安友谊高考成绩查询,2021年广安友谊中学升学率高不高?
  5. 2020牛客暑期多校训练营(第八场)
  6. video.min.js php,用Video.js实现H5直播界面
  7. 奇安信2023HVV面试笔记
  8. 【疯壳·嵌入式平板开发教程1】手把手教你做平板电脑-Linux 引导过程
  9. 想知道图片转表格怎么转?简单实用的转换方法分享
  10. 天猫店群是什么意思?天猫店群和传统模式相比有什么优势?