首页 > 其他分享 >2024.11.15 springsecurity执行力逻辑

2024.11.15 springsecurity执行力逻辑

时间:2024-11-15 11:07:29浏览次数:1  
标签:2024.11 15 请求 Spring JWT springsecurity conf Security 认证

@Configuration
@RequiredArgsConstructor
public class SecurityConfiguration {

    private final SecurityHandler securityHandler;

    private final JwtAuthorizeFilter jwtAuthorizeFilter;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(conf -> conf
                        // 需要校验的接口
                        .requestMatchers(SecurityConst.AUTH_CHECK_ARRAY).authenticated()
                        // 注册接口
                        // 其他的都不用要校验
                        .anyRequest().permitAll()
                )
                .formLogin(conf -> conf
                        // 登录页面
                        .loginProcessingUrl(SecurityConst.LOGIN_PAGE)
                        // 成功登录处理
                        .successHandler(securityHandler::onAuthenticationSuccess)
                        // 失败登录处理
                        .failureHandler(securityHandler::onAuthenticationFailure)
                )
                .logout(conf -> conf
                        // 登出页面
                        .logoutUrl(SecurityConst.LOGOUT_PAGE)
                        // 退出登录处理
                        .logoutSuccessHandler(securityHandler::onLogoutSuccess)
                )
                .exceptionHandling(conf -> conf
                        // 没有登录处理
                        .authenticationEntryPoint(securityHandler::onUnAuthenticated)
                        // 没有权限处理
                        .accessDeniedHandler(securityHandler::onAccessDeny)
                )
                // 禁用 csrf
                .csrf(AbstractHttpConfigurer::disable)
                // 不处理 session ,使用token
                .sessionManagement(conf -> conf.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                // token 校验添加过滤器
                .addFilterBefore(jwtAuthorizeFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

}

在 Spring Security 中,当请求到达后端时,执行的顺序大致如下:

1. 请求到达 Spring Security

首先,Spring Security 会拦截所有的 HTTP 请求。它会按照你在配置中定义的安全过滤链(SecurityFilterChain)来依次处理这些请求。

2. SecurityFilterChain 配置生效

SecurityFilterChain 定义了请求的安全策略,它会按照配置的顺序依次执行,配置的顺序对请求的处理结果有影响。在你提供的 SecurityConfiguration 类中,安全过滤链的顺序是:

  • authorizeHttpRequests:确定哪些请求需要认证,哪些可以公开访问。
  • formLogin:如果请求是登录请求,Spring Security 会处理它并触发登录流程。
  • logout:如果请求是退出登录请求,Spring Security 会处理它并触发注销流程。
  • exceptionHandling:处理认证失败(未登录或权限不足)时的行为。
  • csrf:禁用 CSRF 防护(因为你在配置中禁用了 CSRF)。
  • sessionManagement:指定是否使用 HTTP session,这里是配置为无状态(SessionCreationPolicy.STATELESS)。
  • addFilterBefore:添加 JWT 校验过滤器,在执行 UsernamePasswordAuthenticationFilter 之前进行。

3. JWT 校验 (JwtAuthorizeFilter)

当请求到达 Spring Security 后,JwtAuthorizeFilter 会首先被执行,它的职责是解析请求中的 JWT,验证其有效性。如果有效,它会通过 SecurityContextHolder 将认证信息保存到当前请求的上下文中。

  • JWT 校验的逻辑
    • 提取请求中的 Authorization 头部(通常是 Bearer <token>)。
    • 解析并验证 JWT。如果 JWT 合法,则获取其中的用户信息(如 LoginUser)。
    • 创建 UsernamePasswordAuthenticationToken 对象,这个对象代表认证通过的用户。
    • 将认证信息保存到 SecurityContextHolder 中,供后续的授权检查使用。

4. 认证(Authentication)

如果 JwtAuthorizeFilter 过滤器成功认证了请求(即 JWT 验证通过),Spring Security 会使用 SecurityContextHolder 中的 Authentication 对象表示当前认证的用户。

5. 授权(Authorization)

一旦请求通过了身份验证,Spring Security 会继续进行授权处理,即检查用户是否有权限访问请求的资源。

  • 通过 authorizeHttpRequests 进行的授权检查会确定当前用户是否有权限访问该请求。如果用户有权限,则继续执行。
  • 如果用户没有权限,Spring Security 会触发 accessDeniedHandler,并返回一个 403 Forbidden 错误。

6. 登录和登出

如果请求是登录或登出请求:

  • 登录:会调用 formLogin 配置的处理器,在 successHandler 中会执行登录成功的逻辑,比如生成 JWT 返回给前端。
  • 登出:会调用 logout 配置的处理器,在 logoutSuccessHandler 中会执行登出的逻辑。

7. 异常处理

如果请求的用户没有通过认证,Spring Security 会调用 authenticationEntryPoint 来处理未认证的请求,通常是返回一个 401 Unauthorized 错误。如果请求的用户没有足够的权限,则会调用 accessDeniedHandler,通常是返回一个 403 Forbidden 错误。

8. CSRF 处理

如果你没有禁用 CSRF,那么 Spring Security 会检查每个请求是否带有有效的 CSRF token(防止跨站请求伪造)。但在你的配置中,你显式禁用了 CSRF(csrf(AbstractHttpConfigurer::disable)),所以这个步骤不会执行。

9. Session 管理

sessionManagement 中,你配置了 SessionCreationPolicy.STATELESS,这意味着 Spring Security 将不会创建或使用 HTTP Session,因此每个请求都是无状态的,认证信息仅通过 JWT 进行传递。


执行顺序总结:

  1. 请求到达 Spring Security。
  2. JwtAuthorizeFilter 过滤器执行 JWT 校验,如果认证通过,将认证信息保存到 SecurityContextHolder
  3. authorizeHttpRequests 进行授权判断,确认用户是否有权限访问资源。
  4. 如果请求是登录或登出请求,执行相应的处理器(formLoginlogout)。
  5. 如果认证失败,调用 authenticationEntryPoint 进行异常处理。
  6. 如果权限不足,调用 accessDeniedHandler 进行异常处理。

通过这种方式,Spring Security 能够有效地处理身份验证、授权、会话管理等安全问题。

标签:2024.11,15,请求,Spring,JWT,springsecurity,conf,Security,认证
From: https://www.cnblogs.com/258-333/p/18547601

相关文章

  • 人才缺口150万!院士呼吁:加快培养网络安全人才!
    8月11日,首届“京浙英才百人会”在杭州隆重召开。会上,中国工程院院士沈昌祥作了《打造安全可信产业体系和人才队伍,加速发展新质生产力》的主题演讲,在他的内容中特别提到:“从国家安全战略的角度,需要统筹规划全国网络空间安全学科专业建设,加快填补网络安全150多万人才巨大缺口......
  • 150页入门大模型应用开发,看这一本书就够了!(附PDF)
    如果问个问题:有哪些产品曾经创造了伟大的奇迹?ChatGPT应该会当之无愧入选。仅仅发布5天,ChatGPT就吸引了100万用户——当然,数据不是关键,关键是其背后的技术开启了新的AI狂潮,成为技术变革的点火器。就算我们这些周边吃瓜群众都日日活在ChatGPT带来的震撼里,更不用说在......
  • 手把手教你学simulink(15.2)--Simulink 动画控制场景:实现一个基于Simulink的3D角色动画
    目录项目概述项目背景项目目标系统架构系统建模模型设计输入模块控制模块动画模块显示模块模型搭建仿真和结果分析项目总结使用Simulink在动画控制场景下的另一个项目实例详细介绍。这个项目将重点放在使用Simulink设计和仿真一个3D角色动画控制系统,该系统能够......
  • 2024.11.14
    数论一、快速幂#include<iostream>usingnamespacestd;intfastPow(inta,intn){intans=1;while(n){if(n&1)ans=ans*a;a*=a;n>>=1;}returnans;}typedeflonglongll;llfastPow(ll......
  • 2024.11.14 2336版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14
    这段代码是一个SpringSecurity配置类SecurityConfiguration,它主要用于配置SpringSecurity的安全策略,定义了如何处理用户认证、授权、会话管理、跨站请求伪造(CSRF)保护等方面的安全性。下面是对这段代码的逐行解释:1.类定义@Configuration@RequiredArgsConstructorpublic......
  • oracle RMAN Duplicate failing with RMAN-06136, ORA-01503, ORA-00349
     在数据迁移的时候遇到报错RMAN-00571:===========================================================RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS===============RMAN-00571:===========================================================RMAN-03002:failur......
  • 冯梓轩2024.11.14模拟赛反思
    冯梓轩2024.11.14模拟赛反思今天算是把之前犯过的大多数错误都犯了一遍。其实主要问题还是出在T1上,当时一直在想能不能先将\(n\)转成三进制数,然后通过后续调整来将其变合法。但是这个思路想了接近3个半小时也不会做。中途我也没有尝试换一种思路,一直按照进制的方式去死磕,最......
  • 毕业设计_基于springboot+vue的学校赛事管理系统【前后端源码+SQL+可运行】【41015】
    毕业设计_基于springboot+vue的学校赛事管理系统【前后端源码+SQL+可运行】【41015】.zip下载地址:https://download.csdn.net/download/qq_24428851/89982585环境准备:JDK1.8+maven3.6+nodejs14+mysql5.6+redis技术栈后台:springboot+mybatisPlus+Shiro前台:vue+iview+Vu......
  • 毕业设计_基于springboot+vue的学校赛事管理系统【前后端源码+SQL+可运行】【41015】
    毕业设计_基于springboot+vue的学校赛事管理系统【前后端源码+SQL+可运行】【41015】.zip下载地址:https://download.csdn.net/download/qq_24428851/89982585环境准备:JDK1.8+maven3.6+nodejs14+mysql5.6+redis技术栈后台:springboot+mybatisPlus+Shiro前台:vue+iview+Vu......