spring security 实现匿名访问接口
就如同静态资源一样,我们不希望请求时需要认证,而是直接返回结果。
接下来我使用自定义注解完成匿名访问(以@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 实现匿名访问接口相关推荐
- Spring Boot集成Ueditor富文本编辑器,实现图片上传,视频上传,返回内容功能并且通过OSS转换为链接并且解决Spring Security静态资源访问以及跨域问题
学习自https://cloud.tencent.com/developer/article/1452451 现在是晚上22点,刚刚和我们的前端交流完了富文本编辑器的一些意见和看法 还是老样子 需求 ...
- 关于spring security没有调用UserDetailsService接口实现类的解决办法
过程太心酸,也没有报错,security只是拒绝了请求,真是脑袋大,debug了一天,也没看出来哪里出问题了,最后一行一行的看代码找了出来,多了一个重载方法的重写,没有删除,之前以为删除函数内容就行了 ...
- Spring Security原理分析
本文来简单的分析下Spring Security 使用原理.在前面的几节中,已经对 Spring Security 有了一个比较全的使用体验了,这节我们简单的介绍下 Spring Security 基 ...
- Spring Security 实战:基于配置的接口角色访问控制
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...
- Spring Security 2 配置精讲
论坛上看了不少Spring Security的相关文章.这些文章基本上都还是基于Acegi-1.X的配置方式,而主要的配置示例也来自于SpringSide的贡献. 众所周知,Spring Securi ...
- Spring Security登录用户数据获取(4)
1. 登录用户数据获取 登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从 ...
- Spring Security OAuth2.0认证授权知识概括
Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...
- Spring Security 参考手册(一)
Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...
- spring security技术分享
Spring Security技术专题 一.初识认证和授权 1.1 认证 1.2 会话 1.3 授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 角色访问控制 1.5.2 资源访问控制 1. ...
最新文章
- XXL-JOB v2.0.2,分布式任务调度平台 | 多项特性优化更新
- webpack4.x中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
- windows内存结构概述
- html文件头自动生成,基于infinispan源码包HtmlGenerator代码生成器通过指定头部、标题、底部等进行生成HTML文件...
- lambda表达式语法_使用类似Lambda的语法作为Java中的表达式进行切换
- c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充
- Lucene正则表达式查询RegenxQuery
- webstorm两个文件比对_webstorm怎么更改文件名称?或者是重命名
- 【房价预测】基于matlab遗传算法优化BP神经网络房价预测【含Matlab源码 592期】
- 图形化串口助手Serialplot使用小结
- hash冲突的4种解决方案
- matlab安卓官方下载,手机matlab软件下载-MATLAB Mobile手机版下载v5.1.0 安卓官方版-单机手游网...
- 全志h6对比晶晨s905_一决雌雄!64位芯片晶晨S905对比瑞芯微RK3368谁胜?
- python中文分词器(jieba类库)
- 移远M26实现短信接收
- PLC型号的选择方法
- 服务器显示器多少寸合适,购买别冲动!先看多大的显示器适合你
- 云服务器是怎么虚拟的,云服务器怎么虚拟化
- Python之strip详解
- 推荐JSON-handle谷歌插件