首页 > 其他分享 >2024.11.14

2024.11.14

时间:2024-11-14 23:10:59浏览次数:1  
标签:2024.11 14 登录 处理 配置 JWT securityHandler conf

这段代码是一个 Spring Security 配置类 SecurityConfiguration,它主要用于配置 Spring Security 的安全策略,定义了如何处理用户认证、授权、会话管理、跨站请求伪造(CSRF)保护等方面的安全性。下面是对这段代码的逐行解释:

1. 类定义

@Configuration
@RequiredArgsConstructor
public class SecurityConfiguration {
  • @Configuration: 这个注解表示该类是一个 Spring 配置类,用于定义 Bean 和配置 Spring 容器。
  • @RequiredArgsConstructor: 由 Lombok 提供的注解,自动生成一个带有所有 final 字段的构造函数。在这个类中,securityHandlerjwtAuthorizeFilter 都是 final 字段,因此 Lombok 会自动生成一个构造函数来注入这两个依赖。

2. 字段定义

private final SecurityHandler securityHandler;
private final JwtAuthorizeFilter jwtAuthorizeFilter;
  • securityHandler: 这是一个自定义的处理器,负责处理 Spring Security 的认证、授权、登录、登出等操作。
  • jwtAuthorizeFilter: 这是一个自定义的过滤器,用于在请求中验证 JWT(JSON Web Token)是否有效。

3. passwordEncoder Bean

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
  • 这个 Bean 定义了一个 PasswordEncoder,并指定使用 BCryptPasswordEncoder,这是一种常见的加密密码方式,用于加密存储密码。

4. filterChain Bean

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  • SecurityFilterChain 是 Spring Security 配置的核心部分,用于定义 Web 安全配置。HttpSecurity 是用来配置 HTTP 请求的安全性设置。

5. 请求授权配置

http
    .authorizeHttpRequests(conf -> conf
        // 需要校验的接口
        .requestMatchers(SecurityConst.AUTH_CHECK_ARRAY).authenticated()
        // 注册接口
        .anyRequest().permitAll()
    )
  • authorizeHttpRequests(): 配置 HTTP 请求的授权规则。
    • requestMatchers(SecurityConst.AUTH_CHECK_ARRAY).authenticated(): 表示 SecurityConst.AUTH_CHECK_ARRAY 中列出的 URL 路径需要认证才能访问(即需要登录)。
    • anyRequest().permitAll(): 其它所有请求都可以不需要认证,直接允许访问。

6. 登录配置

.formLogin(conf -> conf
    // 登录页面
    .loginProcessingUrl(SecurityConst.LOGIN_PAGE)
    // 成功登录处理
    .successHandler(securityHandler::onAuthenticationSuccess)
    // 失败登录处理
    .failureHandler(securityHandler::onAuthenticationFailure)
)
  • formLogin(): 配置表单登录。
    • loginProcessingUrl(SecurityConst.LOGIN_PAGE): 配置处理登录请求的 URL。
    • successHandler(securityHandler::onAuthenticationSuccess): 配置登录成功后的处理逻辑,调用 securityHandler.onAuthenticationSuccess 方法。
    • failureHandler(securityHandler::onAuthenticationFailure): 配置登录失败后的处理逻辑,调用 securityHandler.onAuthenticationFailure 方法。

7. 登出配置

.logout(conf -> conf
    // 登出页面
    .logoutUrl(SecurityConst.LOGOUT_PAGE)
    // 退出登录处理
    .logoutSuccessHandler(securityHandler::onLogoutSuccess)
)
  • logout(): 配置登出相关的设置。
    • logoutUrl(SecurityConst.LOGOUT_PAGE): 配置处理登出请求的 URL。
    • logoutSuccessHandler(securityHandler::onLogoutSuccess): 配置登出成功后的处理逻辑,调用 securityHandler.onLogoutSuccess 方法。

8. 异常处理配置

.exceptionHandling(conf -> conf
    // 没有登录处理
    .authenticationEntryPoint(securityHandler::onUnAuthenticated)
    // 没有权限处理
    .accessDeniedHandler(securityHandler::onAccessDeny)
)
  • exceptionHandling(): 配置处理认证和授权异常的逻辑。
    • authenticationEntryPoint(securityHandler::onUnAuthenticated): 当用户未登录时,调用 securityHandler.onUnAuthenticated 处理该异常。
    • accessDeniedHandler(securityHandler::onAccessDeny): 当用户没有权限访问某资源时,调用 securityHandler.onAccessDeny 处理该异常。

9. CSRF 禁用

.csrf(AbstractHttpConfigurer::disable)
  • .csrf(AbstractHttpConfigurer::disable): 禁用 CSRF(跨站请求伪造)保护,因为在使用 JWT 等无状态认证时,通常不需要 CSRF 防护。

10. 会话管理

.sessionManagement(conf -> conf.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
  • .sessionManagement(): 配置会话管理策略。
    • SessionCreationPolicy.STATELESS: 配置为无状态会话,即不使用服务器端的 HTTP session。每个请求必须携带有效的 JWT token。

11. JWT 过滤器

.addFilterBefore(jwtAuthorizeFilter, UsernamePasswordAuthenticationFilter.class)
  • addFilterBefore(): 将自定义的 jwtAuthorizeFilter 放置在 UsernamePasswordAuthenticationFilter 之前进行处理。jwtAuthorizeFilter 用于验证请求中携带的 JWT token 是否有效。

12. 构建 SecurityFilterChain

.build();
  • 最后调用 .build() 方法将所有配置整合成一个完整的 SecurityFilterChain 实例。

总结

  • 这个类配置了 Spring Security 的核心安全策略,包括身份验证(使用表单登录)、权限控制、异常处理、会话管理(无状态)、JWT 验证等。
  • 使用了 SecurityHandler 处理认证、授权、登录、登出等过程,JwtAuthorizeFilter 用于验证请求中的 JWT token。
  • 还禁用了 CSRF,配置了无状态会话,这对于基于 token 的认证(如 JWT)非常常见。

标签:2024.11,14,登录,处理,配置,JWT,securityHandler,conf
From: https://www.cnblogs.com/258-333/p/18547068

相关文章

  • WLAN学习-11.14
    来源:1.WLAN产品2.capwap工作原理......
  • 冯梓轩2024.11.14模拟赛反思
    冯梓轩2024.11.14模拟赛反思今天算是把之前犯过的大多数错误都犯了一遍。其实主要问题还是出在T1上,当时一直在想能不能先将\(n\)转成三进制数,然后通过后续调整来将其变合法。但是这个思路想了接近3个半小时也不会做。中途我也没有尝试换一种思路,一直按照进制的方式去死磕,最......
  • Alpha冲刺(2/14)——2024.11.13
    目录一、团队成员分工与进度二、成员任务问题及处理方式三、冲刺会议内容记录会议内容四、GitHub签入记录及项目运行截图GitHub签入记录项目运行截图五、项目开发进展及燃尽图项目开发进展燃尽图六、团队成员贡献表一、团队成员分工与进度成员完成的任务完成的任务时长剩......
  • 2024.11.14 2142版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14 2122版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14 2105版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14 鲜花
    双调排序的正确性证明暨第八交响曲题解推歌:DoubleAgent好多题解都写的或多或少有问题(包括那篇\(30\)分钟速通),终于是整明白了。首先给出双调序列的定义:满足一下条件之一的序列\(\existsk,\foralli<k,a_i>a_{i+1}\land\foralli>k,a_i<a_{i+1}\)即是单谷。其可以通过......
  • 14.策略者模式设计思想
    14.策略者模式设计思想目录介绍01.策略模式基础介绍1.1策略模式由来1.2策略模式定义1.3策略模式场景1.4策略模式思考1.5策略模式的重心1.6理解策略唯一性1.7主要解决的问题02.策略模式原理2.1罗列一个场景2.2用例子理解策略2.3需求普通实现2.4案例......
  • 241114 noip 模拟赛
    省流:\(90+100+20+10\)。t1t2花太久时间了。T1题意:给一张\(n\timesm\)的网格图,\((x,y)\)与\((x+1,y)\)的边为\(a_x+b_y\),\((x,y)\)与\((x,y+1)\)的边为\(c_x+d_y\)。求这张图的最小生成树的边权和。\(n,m\leq10^6\)。稍微画图注意到,一个点一定跟它......
  • 2024/11/14日 日志 关于 MVC 分层开发模式
    MVC是一种分层开发的模式,是我们在完成项目时常用的开发模式。点击查看代码--MVC模式--MVC是一种分层开发的模式,其中:--M:Model,业务模型,处理业务--V:View,视图,界面展示--C:Controller,控制器,处理请求,调用模型和视图----MVC好处--职责单一,互不影响--有利于分......