• Spring Security即将弃用配置类WebSecurityConfigurerAdapter


    efd4900a2b6c89834f20b3b68fc4a71d.gif

    2022年的开工福利已经发布,点击下面按钮获取最新PDF。

    [这里是图片002]

    用过WebSecurityConfigurerAdapter的都知道对Spring Security十分重要,总管Spring Security的配置体系。但是马上这个类要废了,你没有看错,这个类将在5.7版本被@Deprecated所标记了,未来这个类将被移除。

    433e27629a9f5344be655bc7ba3ba601.png

    相关的issues已经被处理并关闭

    对此对此网友大呼“学着学着就被弃用了”。既然马上要弃用了,总要有个过渡方案或者新玩法吧。

    早在2021年3月份胖哥就写了一篇文章,把新玩法给明明白白说清楚了,如果你看了的话,肯定不会学废弃技术。这里把整套的替代方案再搞一遍,可别再学过时技术了。

    版本需要Spring Security 5.4.x及以上。

    HttpSecurity新旧玩法对比

    旧玩法:

    @Configuration
    static?class?SecurityConfig?extends?WebSecurityConfigurerAdapter?{
    ????@Override
    ????protected?void?configure(HttpSecurity?http)?throws?Exception?{
    ????????http
    ????????????.antMatcher("/**")
    ????????????.authorizeRequests(authorize?->?authorize
    ????????????????????.anyRequest().authenticated()
    ????????????);
    ????}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    新玩法:

    @Bean
    SecurityFilterChain?filterChain(HttpSecurity?http)?throws?Exception?{
    ????return?http
    ????????????.antMatcher("/**")
    ????????????.authorizeRequests(authorize?->?authorize
    ????????????????????.anyRequest().authenticated()
    ????????????)
    ????????????.build();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    相关原理去看这一篇文章。

    WebSecurity新旧玩法对比

    使用WebSecurity.ignoring()忽略某些URL请求,这些请求将被Spring Security忽略,这意味着这些URL将有受到 CSRF、XSS、Clickjacking 等攻击的可能。以下示例仅仅作为演示,请勿使用在生产环境。是不是又学到了呢?

    旧玩法:

    @Configuration
    public?class?SecurityConfiguration?extends?WebSecurityConfigurerAdapter?{
    
    ????@Override
    ????public?void?configure(WebSecurity?web)?{
    ????????//?仅仅作为演示
    ????????web.ignoring().antMatchers("/ignore1",?"/ignore2");
    ????}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    新玩法:

    @Configuration
    public?class?SecurityConfiguration?{
    
    ????@Bean
    ????public?WebSecurityCustomizer?webSecurityCustomizer()?{
    ????????//?仅仅作为演示
    ????????return?(web)?->?web.ignoring().antMatchers("/ignore1",?"/ignore2");
    ????}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果你需要忽略URL,请考虑通过HttpSecurity.authorizeHttpRequestspermitAll来实现。

    AuthenticationManager新旧玩法对比

    AuthenticationManager配置主要分为全局的(Global )、本地的(Local)。

    旧玩法

    @Configuration
    public?class?SecurityConfiguration?extends?WebSecurityConfigurerAdapter?{
    
    ????@Override
    ????protected?void?configure(AuthenticationManagerBuilder?auth)?throws?Exception?{
    ????????auth.jdbcAuthentication();
    ????}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面是通过WebSecurityConfigurerAdapter开启的是本地配置。开启全局配置需要覆写其authenticationManagerBean()方法并标记为Bean:

    @Bean(name?name="myAuthenticationManager")
    ????@Override
    ????public?AuthenticationManager?authenticationManagerBean()?throws?Exception?{
    ????????return?super.authenticationManagerBean();
    ????}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    新玩法

    本地配置通过HttpSecurity.authenticationManager实现:

    @Configuration
    public?class?SecurityConfiguration?{
    
    ????@Bean
    ????public?SecurityFilterChain?filterChain(HttpSecurity?http)?throws?Exception?{
    ????????http
    ????????????.authorizeHttpRequests((authz)?->?authz
    ????????????????.anyRequest().authenticated()
    ????????????)
    ????????????.httpBasic(withDefaults())
    ????????????.authenticationManager(new?CustomAuthenticationManager());
    ????}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    全局配置摆脱了依赖WebSecurityConfigurerAdapter.authenticationManagerBean()方法,只需要定义一个AuthenticationManager类型的Bean即可:

    @Bean
    ????AuthenticationManager?ldapAuthenticationManager(
    ????????????BaseLdapPathContextSource?contextSource)?{
    ????????LdapBindAuthenticationManagerFactory?factory?=?
    ????????????new?LdapBindAuthenticationManagerFactory(contextSource);
    ????????factory.setUserDnPatterns("uid={0},ou=people");
    ????????factory.setUserDetailsContextMapper(new?PersonContextMapper());
    ????????return?factory.createAuthenticationManager();
    ????}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当然还可以通过自定义GlobalAuthenticationConfigurerAdapter并注入Spring IoC来修改AuthenticationManagerBuilder,不限制数量,但是要注意有排序问题。相关的思维导图:

    dc5ae58e377e91a781efaba54ee30634.png

    最后

    很多技术方案都不是直接更改的,是会有一个变化的过程,只要你紧追变化,其实也就没有变化。这一篇是不是学会了不少呢?欢迎留言发表看法,当然点赞再看也不能少哦。

    Spring Security的内置过滤器是如何维护的

    2022-02-21

    [这里是图片005]

    附DEMO| 绝活!Spring Security过滤器就该这么配置

    2022-02-16

    [这里是图片006]

    OAuth2授权服务器Keycloak宣布不再适配Spring Boot和Spring Security

    2022-02-15

    [这里是图片007]

    f4815fa40ba165ad8f32a0151bd0e39e.gif

    7b3ac252dbba46549694cdab0e16652d.png

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    亚马逊筋膜枪UL1647测试报告流程介绍
    一句话解释什么是出口IP
    fastadmin中api模块自动validate验证参数
    【C++--string模拟实现】
    基础练习 查找整数
    Aria2 for Mac (免HomeBrew)
    SqlSessionFactory与SqlSession
    四、支付宝支付对接 - SDK开发、业务对接、支付回调、支付组件(2)
    精通Java事务编程(2)-弱隔离级别之已提交读
    【Kali安全渗透测试实践教程】第9章 无线网络渗透
  • 原文地址:https://blog.csdn.net/geejkse_seff/article/details/126114162