SpringBoot--Spring Security(一)

SecurityAutoConfiguration源码解析 SecurityAutoConfiguration 详解 SpringBoot 对 Security 的支持类均位于 org.springframework.boot.autoconfigure.security包下,主要通过 SecurityAutoConfiguration 自动配置类和 SecurityProperties 属性配置来完成。 下面,我们通过对 SecurityAutoConfiguration及引入的相关自动配 置源码进行解析说明。 @Configuration(proxyBe 阅读详情

SpringBoot–Spring Security(一)

一、概述

源码基于SpringBoot 2.7.xx版本

官网:https://spring.io/projects/spring-security

1.1 自动装配概览

  • SecurityAutoConfiguration
    • DefaultAuthenticationEventPublisher
    • SpringBootWebSecurityConfiguration
      • @EnableWebSecurity
        • WebSecurityConfiguration
        • SpringWebMvcImportSelector
        • OAuth2ImportSelector
        • HttpSecurityConfiguration
        • @EnableGlobalAuthentication
          • AuthenticationConfiguration
    • SecurityDataConfiguration
  • UserDetailsServiceAutoConfiguration
    • InMemoryUserDetailsManager
  • SecurityFilterAutoConfiguration
    • DelegatingFilterProxyRegistrationBean
  • @EnableMethodSecurity
    • MethodSecuritySelector
      • PrePostMethodSecurityConfiguration
      • SecuredMethodSecurityConfiguration
      • Jsr250MethodSecurityConfiguration

二、自动装配详解

2.1 SecurityAutoConfiguration

  1. 注册 DefaultAuthenticationEventPublisher;
  2. 导入另外两个安全配置类SpringBootWebSecurityConfiguration、SecurityDataConfiguration

2.2 SpringBootWebSecurityConfiguration


@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
class SpringBootWebSecurityConfiguration {
   
   

    @Configuration(proxyBeanMethods = false)
    // 条件一 classpath中存在 SecurityFilterChain.class, HttpSecurity.class
    // 条件二 没有自定义 WebSecurityConfigurerAdapter.class, SecurityFilterChain.class
    @ConditionalOnDefaultWebSecurity
    static class SecurityFilterChainConfiguration {
   
   
        @Bean
        @Order(SecurityProperties.BASIC_AUTH_ORDER)
        SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
   
   
            // 默认情况下对所有请求进行权限控制
            http.authorizeRequests().anyRequest().authenticated();
            http.formLogin();
            http.httpBasic();
            return http.build();
        }
    }

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnMissingBean(name = BeanIds.SPRING_SECURITY_FILTER_CHAIN)
    @ConditionalOnClass(EnableWebSecurity.class)
    @EnableWebSecurity
    static class WebSecurityEnablerConfiguration {
   
   

    }
}

2.2.1 SecurityFilterChain

默认的SecurityFilterChain,对所有请求进行权限控制,默认配置引入条件

  1. classpath中存在 SecurityFilterChain.class, HttpSecurity.class
  2. 没有自定义 WebSecurityConfigurerAdapter.class, SecurityFilterChain.class

2.2.2 @EnableWebSecurity

导入了如下4个类:

  1. WebSecurityConfiguration
  2. SpringWebMvcImportSelector
  3. OAuth2ImportSelector
  4. HttpSecurityConfiguration
2.2.2.1 WebSecurityConfiguration

WebSecurity配置类,创建一个FilterChainProxy bean来对用户请求进行安全过滤,这个FilterChainProxy bean的
名称为springSecurityFilterChain,它也是一个Filter,最终会被作为DelegatingFilterProxy代理的对象放入Spring容器中。

/**
 *  WebSecurity 配置类 : 
 *  1. 使用一个 WebSecurity 对象基于安全配置创建一个 FilterChainProxy 对象来对用户请求进行安全过滤。 
 *  2. 也会暴露一些必要的 bean。
 *  3. 如何定制 Spring security 的web 安全,也就是 WebSecurity 对象
 *     3.1 提供一个配置类,实现了接口 WebSecurityConfigurer
 *     3.2 或者创建一个WebSecurityCustomizer对象
 *    该配置类的配置会在使用 @EnableWebSecurity 时应用到系统。
 */
@Configuration(proxyBeanMethods = false)
public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware {
   
   

    private WebSecurity webSecurity;
    // 是否启用了调试模式,来自注解 @EnableWebSecurity 的属性 debug,缺省值 false
    private Boolean debugEnabled;

    private List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers;

    private List<SecurityFilterChain> securityFilterChains = Collections.emptyList();

    private List<WebSecurityCustomizer> webSecurityCustomizers = Collections.emptyList();

    private ClassLoader beanClassLoader;

    @Autowired(required = false)
    private ObjectPostProcessor<Object> objectObjectPostProcessor;

    @Bean
    public static DelegatingApplicationListener delegatingApplicationListener() {
   
   
        return new DelegatingApplicationListener();
    }

    // 定义一个表达式处理器bean,缺省为一个 DefaultWebSecurityExpressionHandler,
    //  仅在 bean springSecurityFilterChain 实例化之后才能实例化
    @Bean
    @DependsOn(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
    public SecurityExpressionHandler<FilterInvocation> webSecurityExpressionHandler() {
   
   
        return this.webSecurity.getExpressionHandler();
    }

    // 定义 FilterChainProxy , 名字为 springSecurityFilterChain
    @Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
    public Filter springSecurityFilterChain() throws Exception {
   
   
        boolean hasConfigurers = this.webSecurityConfigurers != null && !this.webSecurityConfigurers.isEmpty();
        boolean hasFilterChain = !this.securityFilterChains.isEmpty();
        Assert.state(!(hasConfigurers && hasFilterChain),
                "Found WebSecurityConfigurerAdapter as well as SecurityFilterChain. Please select just one.");
        if (!hasConfigurers && !hasFilterChain) {
   
   
            // 如果没有 webSecurityConfigurer, 则提供一个却省的
            WebSecurityConfigurerAdapter adapter = this.objectObjectPostProcessor
                    .postProcess(new WebSecurityConfigurerAdapter() {
   
   
                    });
            this.webSecurity.apply(adapter);
        }
        for (SecurityFilterChain securityFilterChain : this.securityFilterChains) {
   
   
            this.webSecurity.addSecurityFilterChainBuilder(() -> securityFilterChain);
            for (Filter filter : securityFilterChain.getFilters()) {
   
   
                if (filter instanceof FilterSecurityInterceptor) {
   
   
                    this.webSecurity.securityInterceptor((FilterSecurityInterceptor) filter);
                    break;
                }
            }
        }
        for (WebSecurityCustomizer customizer : this.webSecurityCustomizers) {
   
   
            customizer.customize(this.webSecurity);
        }
        // 根据配置 webSecurityConfigurers或者缺省 WebSecurityConfigurerAdapter 构建 
        // FilterChainProxy 并返回,这是最终加入到Servlet容器的Filter chain 。
        return this.webSecurity.build();
    }

    // 定义一个bean,是web调用权限评估器,用于判断一个用户是否可以访问某个URL,
    // 对于 JSP tag 支持必要。仅在bean springSecurityFilterChain 被定义时才生效。
    @Bean
    @DependsOn(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
    public WebInvocationPrivilegeEvaluator privilegeEvaluator() {
   
   
        return this.webSecurity.getPrivilegeEvaluator();
    }

    // 注入webSecurityConfigurers
    @Autowired(required = false)
    public void setFilterChainProxySecurityConfigurer(ObjectPostProcessor<Object> objectPostProcessor,
                                                      ConfigurableListableBeanFactory beanFactory) throws Exception {
   
   
        this.webSecurity = objectPostProcessor.postProcess(new WebSecurity(objectPostProcessor))
spring-boot:使用spring security实现用户登录注册(一) 项目地址:https://github.com/lizhibin205/simple_web_v2 一、数据库表 CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', `name` varchar(45) COLLATE utf8mb4_unicode_ci ... 阅读详情

相关推荐

基于Spring Boot2 + Spring Security OAuth2 实现单点登陆(一)

关于OAuth2的基本介绍:点这里 Spring Security 5.0开始对密码相关内容做了修改,具体查看这里 实现一个最基本的OAuth2认证 项目使用3个独立的工程分别实现认证服务、资源服务器和单点登陆服务器 源码地址 添加项目依赖 allprojects { apply plugin: 'idea' apply plugin: 'java' }...

火星人专栏 3万+

SpringBoot3 集成 Spring Security6 详细介绍(一)

Spring Boot 3 集成 Spring Security 6 详细介绍 Spring Security是一个提供身份验证、授权和防御常见攻击的安全框架。

qq_43419105的博客 945

loadStop的原因导致的SSUSP

Total内存值是可用来调度的可用内存,当前可用内存为 0M。 loadSched和loadStop的阈值是根据 Total 内存和节点内存来做限制的。 loadStop 50G,现在有大量作业SSUSP,说明之前某个时间点该节点内存可能有低于50G的时候,导致作业SSUSP,具体是否是这个原因引起的需要用 bjobs -l JobID 看下作业的详细信息。 如果是loadStop的原因导致的 SSUSP,根据loadStop设置的阈值,Total 值高于loadStop值后,将逐步恢复挂起的作业

Blueberry521的博客 661

YOLOv11模型改进:利用注意力机制实现小目标检测精度跃升

如果你在实操中遇到精度提升不明显或速度下降过多的问题,不妨尝试调整注意力模块的类型(如替换为CA)或插入层级,或针对性优化小目标的数据集增强策略。记住,小目标检测的核心是“特征强化与空间定位”,只要结合业务场景灵活调整注意力模块的组合,你也能让YOLOv11在小目标识别任务中脱颖而出。接下来,我们从模块选型到代码落地,一步步带你打造“小目标检测专精版”YOLOv11,真正帮你解决工业场景中(如安防、质检)的小目标识别痛点。在城市安防场景中,改进后的YOLOv11对远处行人、车辆(小目标)的识别准确率提升。

m0_71589036的博客 450

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

weixin_45735391的博客 6万+

58子站安居,经纪人营销管理平台登录接口加密逆向

实战场景password 实战分析 本次要解决的站点依旧来源自78技术人社群,有朋友希望再次说明一下其登录模块的加密参数寻找与逆向逻辑,本文我们就一起分析一下。 站点地址为:vip.anjuke.com/portal/login 通过开发者工具,可以简简单单的寻找到相应的数据。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 2万+

地平线旭日X5开发板--搭建ROS1环境开发

由于RDK X5是基于Ubuntu22.04 进行版本释放,而ROS1只兼容到了20.04,为了更很好的做以前ROS1相关代码方案的快速迁移,提供了使用docker 的ros环境,进而使用ros1的方案。

bingdund的博客 1018

XRoboToolkit —— 基于 PICO 4 Ultra 的机器人遥操作方案(一)

视觉-语言-动作模型(Vision-Language-Action models)的快速发展催生了对大规模、高质量机器人演示数据集的迫切需求。尽管遥操作是数据采集的主要方法,但现有方法存在可扩展性有限、设置流程复杂以及数据质量不佳等问题。本文提出XRoboToolkit,这是一个基于OpenXR标准的跨平台扩展现实(XR)机器人遥操作框架。该系统具备低延迟立体视觉反馈、基于优化的逆运动学算法,并支持多种跟踪模态,包括头部、控制器、手部及辅助运动追踪器。

2506_90492529的博客 3296

C#上位机开发:西门子/三菱PLC通信,新手直接上手

对着西门子S7协议文档看半天,连“DB块地址怎么写”都搞不懂;写三菱PLC代码时,分不清MC协议和Modbus的区别,代码改来改去连不上;好不容易跑通代码,换个PLC型号又报错,不知道哪里出问题;后来发现,新手学PLC通信根本不用先啃协议文档——先跑通“能通信”的代码,再慢慢理解底层逻辑,效率至少提升3倍。西门子PLC:用S7NetPlus库(新手最友好),实现以太网通信,支持S7-200 SMART/1200/1500;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 871

YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py

全网最详细的YOLOv5之推理部分detect.py源码逐行注释,近四万字的超详细讲解!小白入门必看!

路人贾的博客 5万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: SpringBoot扩展点--Aware
下一篇: SpringBoot--Spring Security(二)
fanderboy
博客等级 码龄4年 356粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanderboy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值