首页 > 其他分享 >一步一步实现若依框架--2.5匿名注解@Anonymous

一步一步实现若依框架--2.5匿名注解@Anonymous

时间:2023-08-04 16:55:38浏览次数:33  
标签:urls 一步 -- spring url Anonymous 注解 public

 1实现绕过权限认证,可以直接访问某些接口。 这些部分可以直接在Spring Security中的配置去写,也可以像这个主角这样给添加了注解的方法或类进行放行。   原理:在spring security设置拦截前,获取到所有添加了该注解的请求,把这些请求添加到放开拦截的配置中。 2实现

a)新增注解(注解中内容是可以空的)

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous {
}

b)在spring security进行配置的时候,获取到添加了注解的类或方法

  之前使用注解的时候都是在切面中,也就是当程序执行到添加了注解时程序能运行到切面里的代码。现在要在spring初始化bean后获取到全部的请求信息,在spring的生命周期 afterPropertiesSet时 通过调用
  RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
  Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
可以获取到。这个逻辑封装到了工具类 PermitAllUrlProperties中。
@Configuration
public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware {
    /**
     * 正则表达式 匹配path variable
     * 如: @GetMapping(value = "/configKey/{configKey}") 进行匹配后替换为/configKey/*
     *
     */
    private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}");

    /**
     * spring 上下文
     * 从中可以获取到各种bean
     */
    private ApplicationContext applicationContext;
    /**
     * 该集合中保存了全部标记过匿名注解的url请求
     */
    private List<String> urls = new ArrayList<>();

    public String ASTERISK = "*";

    @Override
    public void afterPropertiesSet()  {
        // 获取全部的handlerMappings
        RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
        Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();

        map.keySet().forEach(info->{
            HandlerMethod handlerMethod = map.get(info);
            // 获取方法上的注解 替代path variable 为 *
            Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class);
            Optional.ofNullable(method).ifPresent(anonymous->info.getPatternsCondition().getPatterns()
                    .forEach(url->urls.add(RegExUtils.replaceAll(url,PATTERN,ASTERISK))));

            // 获取类上的注解
            Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class);
            Optional.ofNullable(controller).ifPresent(anonymous->info.getPatternsCondition().getPatterns()
                    .forEach(url->urls.add(RegExUtils.replaceAll(url,PATTERN,ASTERISK))));

        });
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public List<String> getUrls() {
        return urls;
    }

    public void setUrls(List<String> urls) {
        this.urls = urls;
    }
}
PermitAllUrlProperties 工具类

c)配置放开拦截

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
    @Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    // 注解标记允许匿名访问的url
    ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
    permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());
    ... 其他配置
 }

  3. 测试

  目前对于没有添加匿名注解的都会拦截不允许访问。

  4.总结

  公共的方法很多都是通过注解、切面进行实现的;结合spring的生命周期函数,实现公共逻辑的处理。很多时候是结合了servlet和过程和spring的能力进行处理的。

  代码中添加了很多spring security的配置,以及涉及到的一些工具类。framework.config.SecurityConfig是Spring Security的配置的核心,从这个类会把对security的扩展配置进去的。UserDetailsServiceImpl是重点类,实现认证过的关键类。spring security的配置和扩展很多,需要理解下原理去梳理下常见的配置内容,但是总之就是去配置和扩展框架。

 

代码地址:https://github.com/hunji/RYMirror/releases/tag/2.5%E5%8C%BF%E5%90%8D%E6%B3%A8%E8%A7%A3--SpringSecurity

UserDetailsServiceImpl

标签:urls,一步,--,spring,url,Anonymous,注解,public
From: https://www.cnblogs.com/hunji-fight/p/17606433.html

相关文章

  • 排序
    排序知识框架No.1排序的基本概念一、排序定义排序,就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。为了查找方便,通常希望计算机中的表是按关键字有序的。排序的确切定义如下:输入:n个记录R1,R2,...,Rn,对应的关键字为k1,k2,...,kn。输出:......
  • 技术篇54:也罢!做也罢,不做也罢,股票均为情绪发泄之载体;
    爱也罢恨也罢爱恨心胸皆无挂有缘无缘前生定爱者该爱恨却白搭苦也罢乐也罢酸甜从来伴苦辣笑口常开大丈夫苦也哈哈乐也哈哈富也罢穷也罢幸福不靠金钱架豪华恬淡各千秋富者辉煌穷也清雅福也罢祸也罢福祸双刃切记下人生坎坷是阶梯福悬当头祸踩脚下成也罢败也罢莫以成败论高下尽力奋斗......
  • SQLserver值是否存在另外一个表中
    在SQL中,查询存在一个表而不在另一个表中的数据记录的方法有很多,介绍其中4种:1、方法一(仅适用单个字段):使用notin,比较容易理解,缺点是效率低如:selectA.IDfromAwhereA.IDnotin(selectIDfromB);2、方法二(适用多个字段匹配):使用leftjoin...on...,"B.IDisnull"表......
  • 国密算法SM2介绍
    国密算法是我国自主研发创新的一套数据加密处理系列算法。从SM1-SM4分别实现了对称、非对称、摘要等算法功能。特别适合应用于嵌入式物联网等相关领域,完成身份认证和数据加解密等功能。当然,默认的前提条件是算法密钥必须保证安全性,因此要将国密算法嵌入到硬件加密芯片中结合使用。......
  • 间歇性焦虑
    目前教资科二过了一遍,科三把大学知识做完了,科一文化素养和阅读之类都没看;高代跳过了行列式,复习了矩阵、线性空间、线性变换,现在正在多项式部分;由于时间紧张,抽代进行得很慢,刚看到groupactions,notes也没写完.今天莫名地感到焦虑,不知道是peerpressure还是自己进行到了瓶颈期,突然......
  • CF 下分记录
    7.27edu152\(+173=2048\)B没细看数据范围WA了一次D没判\(i-1=0\)WA了一次E.MaxtotheRightofMin考虑增大右端点,维护每个左端点的合法性当右端点从\(r-1\)增大到\(r\)时,若\(a[r-1]<a[r]\):\(r\)只能作为区间最大值。记上一个\(>a[r]\)的位置是\(p\),那......
  • #轮廓线dp#HDU 1400 Mondriaan's Dream
    题目传送门分析状压dp会TLE,考虑用轮廓线dp,设\(dp[i][j][S]\)表示现在处理到\((i,j)\)这个位置轮廓线上状态为\(S\)的情况二进制位为1表示左边或者上方有骨牌跨过轮廓线,然后分类讨论转移一下即可代码#include<cstdio>#include<cstring>usingnamespacestd;con......
  • 逆水行舟:水滴的成功故事
    近期,奥地利饮料公司Waterdrop完成6000万欧元的融资,在饮水创新赛道中获得亮眼成绩。2021年,单我国的饮用水市场规模就已突破2000亿元,2025年有望突破3000亿元,瓶装水作为大众出行必需品,在如此大的体量无疑引来空前激烈的竞争,“纯净水”、“矿泉水”、“无糖饮料”等饮用水产品在大健......
  • 2023值得关注的人工智能7大发展趋势
    随着人工智能技术的不断创新和应用,我们可以看到人工智能在各个领域的应用越来越广泛。其中,有一些趋势特别值得我们关注。1)深度学习技术的发展深度学习技术在图像识别、语音识别、自然语言处理等领域表现出色,随着硬件计算能力的提升和大量数据的积累,深度学习技术将会在更多领域得......
  • asp.net core之实时应用
    本文将介绍ASP.NETCoreSignalR,这是一个强大的实时通信库,用于构建实时、双向通信应用程序。我们将探讨SignalR的基本概念、架构和工作原理,并提供一些示例代码来帮助读者更好地理解和使用SignalR。ASP.NETCoreSignalR提供了一种简单而强大的方式来构建实时通信应用程序。SignalR......