神奇!自己 new 出来的对象一样也可以被 Spring 容器管理!

本文详细解读了SpringSecurity中ObjectPostProcessor的作用,特别是在非自动扫描的代码中如何手动注册实例到Spring容器,并通过实例分析了其在框架中的运用。此外,还讨论了SpringSecurity中的其他相关概念,如密码加密、权限控制和单点登录实现等。
摘要由CSDN通过智能技术生成
  1. 要学就学透彻!Spring Security 中 CSRF 防御源码解析

  2. Spring Boot 中密码加密的两种姿势!

  3. Spring Security 要怎么学?为什么一定要成体系的学习?

  4. Spring Security 两种资源放行策略,千万别用错了!

  5. 松哥手把手教你入门 Spring Boot + CAS 单点登录

  6. Spring Boot 实现单点登录的第三种方案!

  7. Spring Boot+CAS 单点登录,如何对接数据库?

  8. Spring Boot+CAS 默认登录页面太丑了,怎么办?

  9. 用 Swagger 测试接口,怎么在请求头中携带 Token?

  10. Spring Boot 中三种跨域场景总结

  11. Spring Boot 中如何实现 HTTP 认证?

  12. Spring Security 中的四种权限控制方式

  13. Spring Security 多种加密方案共存,老破旧系统整合利器!

如果大家研究过松哥的微人事项目,就会发现里边的动态权限配置有这样一行代码:

@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.withObjectPostProcessor(new ObjectPostProcessor() {

@Override

public O postProcess(O object) {

object.setAccessDecisionManager(customUrlDecisionManager);

object.setSecurityMetadataSource(customFilterInvocationSecurityMetadataSource);

return object;

}

})

.and()

}

}

这里的 withObjectPostProcessor 到底该如何理解?

今天松哥就来和大家揭开谜题。

1.ObjectPostProcessor 的作用


我们先来看下 ObjectPostProcessor 到底有啥作用,先来看一下这个接口的定义:

package org.springframework.security.config.annotation;

public interface ObjectPostProcessor {

O postProcess(O object);

}

接口中就只有一个 postProcess 方法。

我们再来看看 ObjectPostProcessor 的继承关系:

两个比较重要的实现类,其中 AutowireBeanFactoryObjectPostProcessor 值得一说,来看下 AutowireBeanFactoryObjectPostProcessor 的定义:

final class AutowireBeanFactoryObjectPostProcessor

implements ObjectPostProcessor, DisposableBean, SmartInitializingSingleton {

AutowireBeanFactoryObjectPostProcessor(

AutowireCapableBeanFactory autowireBeanFactory) {

this.autowireBeanFactory = autowireBeanFactory;

}

@SuppressWarnings(“unchecked”)

public T postProcess(T object) {

if (object == null) {

return null;

}

T result = null;

try {

result = (T) this.autowireBeanFactory.initializeBean(object,

object.toString());

}

catch (RuntimeException e) {

Class<?> type = object.getClass();

throw new RuntimeException(

"Could not postProcess " + object + " of type " + type, e);

}

this.autowireBeanFactory.autowireBean(object);

if (result instanceof DisposableBean) {

this.disposableBeans.add((DisposableBean) result);

}

if (result instanceof SmartInitializingSingleton) {

this.smartSingletons.add((SmartInitializingSingleton) result);

}

return result;

}

}

AutowireBeanFactoryObjectPostProcessor 的源码很好理解:

  1. 首先在构建 AutowireBeanFactoryObjectPostProcessor 对象时,传入了一个 AutowireCapableBeanFactory 对象,看过 Spring 源码的小伙伴就知道,AutowireCapableBeanFactory 可以帮助我们手动的将一个实例注册到 Spring 容器中。

  2. 在 postProcess 方法中,就是具体的注册逻辑了,都很简单,我就不再赘述。

由此可见,ObjectPostProcessor 的主要作用就是手动注册实例到 Spring 容器中去(并且让实例走一遍 Bean 的生命周期)。

正常来说,我们项目中的 Bean 都是通过自动扫描注入到 Spring 容器中去的,然而在 Spring Security 框架中,有大量的代码不是通过自动扫描注入到 Spring 容器中去的,而是直接 new 出来的,这样做的本意是为了简化项目配置。

这些直接 new 出来的代码,如果想被 Spring 容器管理该怎么办呢?那就得 ObjectPostProcessor 出场了。

2.框架举例


接下来我随便举几个框架中对象 new 的例子,大家看一下 ObjectPostProcessor 的作用:

HttpSecurity 初始化代码(WebSecurityConfigurerAdapter#getHttp):

protected final HttpSecurity getHttp() throws Exception {

if (http != null) {

return http;

}

http = new HttpSecurity(objectPostProcessor, authenticationBuilder,

sharedObjects);

}

WebSecurity 初始化代码(WebSecurityConfiguration#setFilterChainProxySecurityConfigurer):

public void setFilterChainProxySecurityConfigurer(

ObjectPostProcessor objectPostProcessor,

@Value(“#{@autowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers()}”) List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers)

throws Exception {

webSecurity = objectPostProcessor

.postProcess(new WebSecurity(objectPostProcessor));

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

image
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

[外链图片转存中…(img-KdHTWp7l-1712494574305)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值