这篇有点硬 详解 Spring Security 框架

admin 2025年2月23日22:05:25评论21 views字数 337阅读1分7秒阅读模式

干安全的Security框架还不懂就得小心了,面试官一问你怎么防护呢?你咋说,你要是上来给他催一波Security框架防护技巧,估计面试官对你刮目想看。

关于Java安全的代码审计已经更新,对应的面试题也已经更新了。看文末获取把。

4万多字的Java代码审计已更新到我们星球,如果你想在面试中卷过别人,代码审计肯定是不能少的,相关面试题目也已经更新到星球了,下面这张图是代码审计系列的,文字类已更新到星球,需要的看文末4万字的Java代码审计----文末有彩蛋

这篇有点硬 详解 Spring Security 框架

1. 框架介绍

Spring Security 是 Spring 生态系统中的 安全框架,专注于为 Java 应用提供 认证(Authentication) 和 授权(Authorization) 功能。

  • 核心目标:保护应用免受未授权访问、数据泄露及常见安全攻击(如 CSRF、XSS、会话固定等)。
  • 底层原理:基于 Servlet 过滤器(Filter)链,通过拦截请求并应用安全规则,实现细粒度的访问控制。
  • 关键特点
    • 模块化设计,可灵活扩展。
    • 支持多种认证方式(表单、OAuth2、JWT、LDAP 等)。
    • 深度集成 Spring 生态(如 Spring Boot、Spring MVC)。

2. 核心功能

(1) 认证(Authentication)
  • 功能:验证用户身份(如用户名密码、社交登录)。
  • 实现方式
    • 内存认证:直接在配置中定义用户(测试用)。

      @Bean
      public UserDetailsService users(){
          UserDetails user = User.builder()
              .username("user")
              .password("{bcrypt}$2a$10$...")
              .roles("USER")
              .build();
      returnnew InMemoryUserDetailsManager(user);
      }
    • 数据库认证:通过 UserDetailsService 从数据库加载用户。
    • OAuth2/第三方登录:集成 Google、GitHub 等第三方认证。
(2) 授权(Authorization)
  • 功能:控制用户对资源的访问权限(如 URL、方法、数据)。
  • 实现方式
    • 基于角色的访问控制(RBAC)

      http.authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN")
          .antMatchers("/user/**").hasAnyRole("USER""ADMIN")
          .anyRequest().authenticated();
    • 基于表达式的细粒度控制:使用 SpEL 表达式。

      @PreAuthorize("hasRole('ADMIN') or #userId == authentication.name")
      publicvoiddeleteUser(String userId){ ... }
(3) 安全防护
  • CSRF 防护:默认启用,通过 Token 验证防止跨站请求伪造。
  • Session 管理:支持会话固定保护、并发控制。
  • HTTP 安全头:自动添加 X-Content-Type-OptionsStrict-Transport-Security 等头。

3. 应用场景

(1) Web 应用安全
  • 用户登录/登出:支持表单登录、记住我(Remember-Me)功能。
  • 权限分级:按角色(ROLE_ADMIN)或权限(PERMISSION_DELETE)限制访问。
  • REST API 保护:集成 JWT 或 OAuth2 实现无状态认证。
(2) 微服务安全
  • OAuth2 资源服务器:通过 @EnableResourceServer 保护微服务 API。
  • JWT 验证:使用公钥验证 Token 合法性。

    @Bean
    public JwtDecoder jwtDecoder(){
    return NimbusJwtDecoder.withPublicKey(publicKey).build();
    }
(3) 企业级集成
  • LDAP/Active Directory:对接企业目录服务。
  • SAML 2.0:实现单点登录(SSO)。

4. 架构与核心组件

(1) 过滤器链(Filter Chain)

Spring Security 通过一系列过滤器处理请求,核心过滤器包括:

  • SecurityContextPersistenceFilter:存储安全上下文(SecurityContext)。
  • UsernamePasswordAuthenticationFilter:处理表单登录。
  • FilterSecurityInterceptor:最终决定是否允许访问。
(2) 核心接口
  • **UserDetailsService**:加载用户信息(需自定义实现对接数据库)。
  • **AuthenticationProvider**:自定义认证逻辑(如短信验证码)。
  • **AccessDecisionManager**:决定用户是否有权访问资源。
(3) 安全上下文(SecurityContext)
  • 存储当前用户的认证信息(Authentication 对象),通过 SecurityContextHolder 获取:

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName();

5. 与其他框架的集成

(1) Spring Boot
  • 自动配置:只需添加依赖 spring-boot-starter-security,自动启用基础安全配置。
  • 自定义配置:通过 SecurityFilterChain Bean 覆盖默认行为。

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
        http
            .authorizeRequests(auth -> auth.anyRequest().authenticated())
            .formLogin(withDefaults());
    return http.build();
    }
(2) OAuth2
  • 客户端模式:快速集成第三方登录(如 GitHub)。

    spring:
    security:
    oauth2:
    client:
    registration:
    github:
    client-id:your-client-id
    client-secret:your-secret
  • 资源服务器模式:保护自有 API。

    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    publicclassResourceServerConfigextendsWebSecurityConfigurerAdapter{
    @Override
    protectedvoidconfigure(HttpSecurity http)throws Exception {
            http.oauth2ResourceServer().jwt();
        }
    }
(3) JWT(JSON Web Token)
  • 生成 Token:用户登录后返回 JWT。

    String token = Jwts.builder()
        .setSubject(username)
        .setExpiration(new Date(System.currentTimeMillis() + 864000000))
        .signWith(SignatureAlgorithm.HS512, "secret-key")
        .compact();
  • 验证 Token:通过过滤器解析并验证 JWT。

6. 最佳实践与常见问题

(1) 密码加密
  • 强制使用强哈希算法(如 BCrypt):

    @Bean
    public PasswordEncoder passwordEncoder(){
    returnnew BCryptPasswordEncoder();
    }
(2) 权限设计
  • 最小权限原则:用户仅拥有完成操作所需的最小权限。
  • 分层角色:使用角色继承简化管理。

    http.authorizeRequests()
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')");
(3) 常见问题
  • CSRF 防护导致 POST 请求失败:前端需携带 _csrf Token。
  • 静态资源被拦截:配置忽略规则。

    web.ignoring().antMatchers("/css/**""/js/**");

要知道他的用户哦!!!

Spring Security 是 Java 领域最成熟的安全框架,适用于:

  • 需要精细权限控制的 Web 应用。
  • 微服务架构中的 API 安全保护。
  • 企业级身份认证(LDAP、SAML)。

星球介绍

一个人走的很快,但一群人才能地的更远。吉祥同学学安全这个星球🔗成立了1年左右,已经有300+的小伙伴了,如果你是网络安全的学生、想转行网络安全行业、需要网安相关的方案、ppt,戳链接🔗(内有优惠卷)快加入我们吧。系统性的知识库已经有:《Java代码审计》++《Web安全》++《应急响应》++《护网资料库》++《网安面试指南》

这篇有点硬 详解 Spring Security 框架

原文始发于微信公众号(吉祥讲安全):这篇有点硬 详解 Spring Security 框架

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月23日22:05:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   这篇有点硬 详解 Spring Security 框架https://cn-sec.com/archives/3771170.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息