返回顶部
首页 > 资讯 > 精选 >Spring Security怎么实现接口放通
  • 414
分享到

Spring Security怎么实现接口放通

2023-06-30 15:06:22 414人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“spring Security怎么实现接口放通”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security怎么实现接口放通”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一

本文小编为大家详细介绍“spring Security怎么实现接口放通”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security怎么实现接口放通”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1.SpringBoot版本

本文基于的Spring Boot的版本是2.6.7

2.实现思路

新建一个AnonymousAccess注解,该注解是应用于Controller方法上的

新建一个存放所有请求方式的枚举类

通过判断Controller方法上是否存在该注解

SecurityConfig上进行策略的配置

3.实现过程

3.1新建注解

@Inherited@Documented@Target({ElementType.METHOD,ElementType.ANNOTATioN_TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface AnonymousAccess {    }

3.2新建请求枚举类

该类是存放所有的请求类型的,代码如下:

@Getter@AllArgsConstructorpublic enum RequestMethodEnum {        GET("GET"),        POST("POST"),        PUT("PUT"),        PATCH("PATCH"),        DELETE("DELETE"),        ALL("All");        private final String type;    public static RequestMethodEnum find(String type) {        for (RequestMethodEnum value : RequestMethodEnum.values()) {            if (value.getType().equals(type)) {                return value;            }        }        return ALL;    }}

3.3判断Controller方法上是否存在该注解

SecurityConfig类中定义一个私有方法getAnonymousUrl,该方法主要作用是判断controller那些方法加上了AnonymousAccess的注解

    private Map<String, Set<String>> getAnonymousUrl(Map<RequestMappingInfo, HandlerMethod> handlerMethodMap) {        Map<String, Set<String>> anonymousUrls = new HashMap<>(8);        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;    }

3.4在SecurityConfig上进行策略的配置

通过一个SpringUtil工具类获取到requestMappingHandlerMappingBean,然后通过getAnonymousUrl方法把标注AnonymousAccess接口找出来。最后,通过antMatchers细腻化到每个 Request 类型。

    @Override    protected void configure(httpsecurity HttpSecurity) throws Exception {        // 搜寻匿名标记 url: @AnonymousAccess        RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) SpringUtil.getBean("requestMappingHandlerMapping");        Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();        // 获取匿名标记        Map<String, Set<String>> anonymousUrls = getAnonymousUrl(handlerMethodMap);        httpSecurity                //禁用CSRF                .csrf().disable()                .authorizeRequests()                // 自定义匿名访问所有url放行:细腻化到每个 Request 类型                // GET                .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()                // 所有类型的接口都放行                .antMatchers(anonymousUrls.get(RequestMethodEnum.ALL.getType()).toArray(new String[0])).permitAll()                // 所有请求都需要认证                .anyRequest().authenticated();            }

3.5在Controller方法上应用

在Controller上把需要的放通的接口上加上注解,即可不需要认证就可以访问了,是不是很方便呢。例如,验证码不需要认证访问的,代码如下:

    @apiOperation(value = "获取验证码", notes = "获取验证码")    @AnonymousAccess    @GetMapping("/code")    public Object getCode(){        Captcha captcha = loginProperties.getCaptcha();        String uuid = "code-key-"+IdUtil.simpleUUID();        //当验证码类型为 arithmetic时且长度 >= 2 时,captcha.text()的结果有几率为浮点型        String captchaValue = captcha.text();        if(captcha.getCharType()-1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")){            captchaValue = captchaValue.split("\\.")[0];        }        // 保存        redisUtils.set(uuid,captchaValue,loginProperties.getLoginCode().getExpiration(), TimeUnit.MINUTES);        // 验证码信息        Map<String,Object> imgResult = new HashMap<String,Object>(2){{            put("img",captcha.toBase64());            put("uuid",uuid);        }};        return imgResult;    }

3.6效果展示

Spring Security怎么实现接口放通

读到这里,这篇“Spring Security怎么实现接口放通”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Spring Security怎么实现接口放通

本文链接: https://lsjlt.com/news/329817.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Security怎么实现接口放通
    本文小编为大家详细介绍“Spring Security怎么实现接口放通”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security怎么实现接口放通”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • Spring Security实现接口放通的方法详解
    目录1.SpringBoot版本2.实现思路3.实现过程3.1新建注解3.2新建请求枚举类3.3判断Controller方法上是否存在该注解3.4在SecurityConfig上进行...
    99+
    2024-04-02
  • Spring Security权限控制的接口怎么实现
    本篇内容主要讲解“Spring Security权限控制的接口怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Security权限控制的接口怎么实现”吧!...
    99+
    2023-07-05
  • SpringBoot集成Spring security JWT实现接口权限认证
    1、添加依赖 <dependency> <groupId>org.springframework.boot</groupId> ...
    99+
    2024-04-02
  • Spring Security基于注解的接口角色访问控制怎么实现
    本文小编为大家详细介绍“Spring Security基于注解的接口角色访问控制怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security基于注解的接口角色访问控制怎么实现”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-16
  • Spring Security权限管理实现接口动态权限控制
    目录摘要前置知识数据库设计数据库表结构数据库表介绍ums_adminums_roleums_admin_role_relationums_menuums_resourceums_re...
    99+
    2024-04-02
  • Spring Boot怎么实现接口自动幂等
    今天小编给大家分享一下Spring Boot怎么实现接口自动幂等的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2024-04-02
  • spring boot动态生成接口怎么实现
    本篇内容主要讲解“spring boot动态生成接口怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring boot动态生成接口怎么实现”吧!在某些业务场景中,我...
    99+
    2023-06-21
  • 怎么通过接口安全退出Spring Boot
    怎么通过接口安全退出Spring Boot?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、在pom.xml中引入actuator, security依赖 ...
    99+
    2023-05-31
    springboot spring boo bo
  • Spring Security怎么实现自定义访问策略
    本篇内容主要讲解“Spring Security怎么实现自定义访问策略”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Security怎么实现自定义访问策略”吧!...
    99+
    2023-06-29
  • 怎么实现 Spring Boot 接口参数加密解密
    本篇内容主要讲解“怎么实现 Spring Boot 接口参数加密解密”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现 Spring Boot 接口参数加密解密”吧!加密解密本身并不是难事,...
    99+
    2023-06-17
  • C#怎么实现IDisposable接口释放非托管资源
    这篇文章主要介绍了C#怎么实现IDisposable接口释放非托管资源的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么实现IDisposable接口释放非托管资源文章都会有所收获,下面我们一起来看看吧。当...
    99+
    2023-06-30
  • Spring AOP使用接口方式实现
    目录一. 环境准备二、Spring接口方式实现AOP步骤1. 业务接口实现2. 业务类3. 通知类4. 自定义切## 点5.配置xml文件6. 方法入口三. 分析Spring 提供了很多的实现AOP的方式:Spring 接口方式,schem...
    99+
    2019-06-16
    Spring AOP 接口实现 Spring AOP 接口
  • golang 怎么实现接口
    Golang 是一门非常流行的静态类型、并发安全的编程语言。它提供了非常强大的接口机制,使得开发者可以实现代码的模块化和解耦。在本文中,我们将探讨如何使用 Golang 实现接口。什么是接口接口是面向对象编程中非常重要的概念。接口定义了一个...
    99+
    2023-05-14
    Golang
  • 什么是接口?golang中怎么实现接口?
    Golang 是一门受到很多程序员喜爱的编程语言,它拥有卓越的性能和强大的并发特性。在 Golang 中,接口是一种非常重要和强大的特性。本文将详细介绍 Golang 接口的实现。一、什么是接口?接口是一个抽象的概念,它是一组方法的集合,这...
    99+
    2023-05-14
  • 怎么在golang中通过接口嵌套实现复用
    本篇文章为大家展示了怎么在golang中通过接口嵌套实现复用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、数据打...
    99+
    2023-06-14
  • Spring中Aware接口的实现原理是什么
    今天就跟大家聊聊有关Spring中Aware接口的实现原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用示例:@Component&nbs...
    99+
    2024-04-02
  • Spring Security中粒度超细的权限控制怎么实现
    这篇文章主要讲解了“Spring Security中粒度超细的权限控制怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Security中粒度超细的权限控制怎么实现”吧!1...
    99+
    2023-06-19
  • Spring Security怎么实现退出登录和退出处理器
    这篇文章主要介绍“Spring Security怎么实现退出登录和退出处理器”,在日常操作中,相信很多人在Spring Security怎么实现退出登录和退出处理器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-30
  • C#怎么实现串口通信
    本篇内容介绍了“C#怎么实现串口通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架准备出于简单考虑,首先创建一个Winform项目,本文...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作