Spring Security 深度

共 41 题
#

1. DelegatingPasswordEncoder 如何识别旧哈希并在登录后升级,升级写回失败是否应阻断认证

A 密码升级写回失败时应直接拒绝用户登录
B DelegatingPasswordEncoder 只能使用一种算法,无法兼容旧哈希
C 通过编码前缀识别旧哈希算法,登录成功后用新算法升级并写回,写回失败不应阻断已通过的认证 ✓ 正确答案
D 升级密码是认证成功的前提,必须先升级再认证
#

2. FormLogin/HttpBasic/OAuth2 的登录模式

A OAuth2 登录不依赖任何授权服务器即可完成
B HttpBasic 有完整的登录页与会话管理
C FormLogin 面向浏览器表单、HttpBasic 用请求头携带凭据、OAuth2 通过授权服务器做第三方登录,适用场景不同 ✓ 正确答案
D FormLogin 每次请求都在请求头携带明文密码
#

3. JWKS 密钥轮换期间 JwtDecoder 如何缓存和刷新公钥,未知 kid 与端点不可用应如何处理

A 遇到未知 kid 时直接拒绝,无需刷新缓存
B JwtDecoder 每次验证都实时请求 JWKS 端点,不缓存
C JWKS 端点不可用时永远会认证失败,即使有缓存公钥
D JwtDecoder 缓存 JWKS,遇到未知 kid 会触发刷新,刷新失败且无缓存时认证失败并告警 ✓ 正确答案
#

4. OAuth2 Authorization Code + PKCE 在 Spring Security 6.4 与 Spring Cloud Gateway 协同下的会话保持

A PKCE 的 code_verifier 存放在客户端浏览器中
B 网关无需分布式 Session,Token Relay 不需要任何会话
C 下游服务需要各自向授权服务器发起 OAuth2 流程
D 网关作为 OAuth2 客户端完成授权码+PKCE 换取令牌,存于分布式 Session 并通过 Token Relay 转发给下游 ✓ 正确答案
#

5. OAuth2 Resource Server 校验 JWT 时,issuer、audience、时间声明和算法白名单分别防范什么

A 只要验签通过就无需校验 issuer 与 audience
B iss 防伪造来源、aud 防跨服务复用、时间声明防过期、算法白名单防算法混淆,缺一不可 ✓ 正确答案
C aud 校验用于防止 token 被篡改
D 算法白名单用于防止 token 过期
#

6. Spring Security 6.x 的 OpenSAML4 SAML 集成与 Spring Boot 4.0 启动类的依赖兼容性

A OpenSAML4 与 Spring Boot 4.0 完全独立,无需考虑版本
B Spring Security 6.x 通过 spring-security-saml2-service-provider 集成 OpenSAML4,需保证与 Spring Boot 4.0 的依赖版本一致 ✓ 正确答案
C Spring Boot 4.0 启动类需要专门为 SAML 修改
D SAML 集成只能使用 OpenSAML3,不能使用 OpenSAML4
#

7. Spring Security 的测试支持(@WithMockUser/@WithJwt)

A @WithMockUser 只能测试匿名访问
B @WithJwt 需要在测试中真实调用授权服务器
C @WithMockUser 注入模拟用户,@WithJwt 注入模拟 JWT 认证,用于测试方法级安全与认证逻辑 ✓ 正确答案
D 这些注解无法在测试中注入 SecurityContext
#

8. 在 Spring Boot 4.0 中使用 Spring Security 6.4 整合 Keycloak 作为 OIDC IdP 的客户端配置

A Keycloak 只能作为 Resource Server,不能作 OIDC 客户端 IdP
B 无需配置 client-id,只用 issuer-uri 即可
C 通过配置 issuer-uri 与 client-id,启用 oauth2Login,并自定义角色映射把 Keycloak 的 claims 映射为权限 ✓ 正确答案
D 角色映射必须硬编码,无法从 JWT claim 读取
#

9. 在 Spring Cloud 微服务中实现分布式 Session 共享与 Spring Security 的 RememberMe 策略

A 分布式 Session 只能存内存,无法用 Redis
B RememberMe 无需密钥,任何服务都可验证
C 用 Spring Session 把 Session 存 Redis 实现共享,RememberMe 需统一密钥并注意 Cookie 安全属性 ✓ 正确答案
D PersistentTokenRepository 是有状态实现,无法在分布式使用
#

10. 把 JWT claim 映射为 GrantedAuthority 时,如何限制命名空间并防止外部声明直接获得内部角色

A 权限映射无需校验 claim 值格式
B token 中的任何 claim 都可直接映射为内部角色
C 应限定受信任的 claim 命名空间并用白名单过滤,绝不能直接信任 token 中任意声明作为内部角色 ✓ 正确答案
D 外部 IdP 传入的声明可以无条件授予管理员角色
#

11. 注销 JWT 访问令牌时,短过期、撤销表和密钥轮换三种方案如何权衡状态与响应速度

A 短过期无状态响应快但无法即时撤销,撤销表能精确即时撤销但有状态开销,密钥轮换是全局失效 ✓ 正确答案
B 撤销表完全无状态,不影响响应速度
C 密钥轮换可以精确撤销单个 token
D 短过期能即时撤销已泄露的 token
#

12. 虚拟线程与异步任务中 SecurityContext 如何传播,直接依赖 ThreadLocal 会造成什么丢失或串扰

A 虚拟线程中 ThreadLocal 会自动跨线程传播 SecurityContext
B 线程池复用线程不会导致上下文串扰
C SecurityContext 存于 ThreadLocal,异步/虚拟线程不会自动传播,需显式包装或基于 ScopedValue,避免丢失与串扰 ✓ 正确答案
D 异步任务中无需任何处理即可获得当前 SecurityContext
#

13. @PreAuthorize 的 SpEL 与方法级安全

A @PreAuthorize 在方法执行后校验
B @PreAuthorize 通过 SpEL 表达式在方法执行前授权,支持角色、参数与 Bean 引用,需 @EnableMethodSecurity 启用 ✓ 正确答案
C 方法级安全无需任何注解即可自动生效
D @PreAuthorize 只能使用 hasRole,不能引用方法参数
#

14. AuthenticationManagerBuilder 与 AuthenticationConfiguration 的差异

A AuthenticationManagerBuilder 用于局部构建认证管理器,AuthenticationConfiguration 聚合全局配置并提供 AuthenticationManager ✓ 正确答案
B 两者完全相同,可互换使用
C AuthenticationConfiguration 只能构建内存用户
D AuthenticationManagerBuilder 是全局唯一的管理器
#

15. AuthorizationFilter 与基于权限的 URL 访问

A AuthorizationFilter 只做认证,不做授权
B AuthorizationFilter 基于 AuthorizationManager 按 requestMatchers 规则做 URL 级授权,规则按顺序匹配 ✓ 正确答案
C URL 授权规则顺序不影响结果
D 它取代了方法级 @PreAuthorize 的功能
#

16. AuthorizationManager 如何组合 RBAC 与基于资源属性的 ABAC,拒绝决策需要记录哪些审计信息

A RBAC 与 ABAC 无法组合,只能二选一
B 可组合 RBAC(角色)与 ABAC(资源属性)的 AuthorizationManager,拒绝决策应记录操作人、资源、上下文与原因 ✓ 正确答案
C 拒绝决策无需记录审计,只需返回错误
D AuthorizationManager 只能基于角色,不能访问资源属性
#

17. CORS 预检请求为什么应在认证决策前处理,允许凭证时为何不能使用通配来源

A 预检请求应当优先经过认证过滤器
B 允许凭证时可以使用通配来源 *,浏览器会接受
C CORS 预检请求通常携带业务凭据
D 预检请求应在认证前处理以免被拦截,allowCredentials 时不能用通配来源 *,须用具体 Origin 白名单 ✓ 正确答案
#

18. CorsConfigurationSource 的细粒度配置

A 所有路径只能使用同一个 CORS 配置
B 通过 UrlBasedCorsConfigurationSource 可为不同路径注册不同 CORS 策略,也可自定义 source 动态决策 ✓ 正确答案
C CorsConfigurationSource 只能用于全局,不能按路径区分
D 细粒度配置无法区分是否允许凭证
#

19. DelegatingSecurityContextExecutor 包装任务时捕获的是哪一时刻的上下文,任务结束后怎样清理

A 它在任务执行时捕获 SecurityContext
B 它在任务提交时捕获 SecurityContext,任务执行时设置,任务结束后恢复/清理执行线程的上下文 ✓ 正确答案
C 任务结束后不清除上下文,保持原样
D 它只能用于同步执行,不能用于线程池
#

20. LogoutFilter 与 LogoutSuccessHandler

A LogoutSuccessHandler 负责执行登出清理
B 登出时无需清理 Session 与 RememberMe Cookie
C LogoutFilter 通过 LogoutHandler 清理 Session/Cookie/RememberMe,再调用 LogoutSuccessHandler 决定登出后的响应 ✓ 正确答案
D LogoutFilter 默认匹配任意 GET 请求
#

21. Passkey 基于 WebAuthn 的挑战、来源和 RP ID 校验分别防止什么攻击,凭据如何绑定用户

A challenge 防重放、origin 防跨源、RP ID 防跨域滥用,服务端以公钥绑定用户 ✓ 正确答案
B origin 校验用于防止重放攻击
C 服务端保存用户私钥以绑定用户
D challenge 用于加密用户密码
#

22. RememberMe 与 PersistentTokenRepository(JDBC)

A 它把用户密码哈希存进 Cookie
B PersistentTokenRepository 是无状态的,无需数据库
C 它在数据库保存 series/token,自动登录时校验并轮换,可检测重放且可撤销,比 TokenBased 更安全 ✓ 正确答案
D RememberMe 无法被撤销或检测重放
#

23. SecurityFilterChain 的多链配置

A 所有链都会同时执行,取并集
B 一个应用只能配置一个 SecurityFilterChain
C 匹配顺序无关,任意链都可处理请求
D 多个链按 securityMatcher 匹配路径,第一个匹配的链生效,特殊/精确的链应放在前面 ✓ 正确答案
#

24. Spring Security 6.4 的 AuthorizationEventPublisher 在审计日志(Audit)的工程价值

A 它只负责认证,不涉及授权
B 授权拒绝事件不携带任何上下文信息
C 审计只能记录登录成功,无法记录授权决策
D 它发布授权成功/拒绝事件,通过监听可记录完整的授权决策审计,追溯越权尝试 ✓ 正确答案
#

25. Spring Security 6.x 的 CORS 配置与 Spring Cloud Gateway 全局 CORS 的冲突解决策略

A 两层 CORS 必须同时配置,否则无法工作
B 最好在网关统一处理 CORS,服务层保持与网关一致或避免重复配置,防止响应头重复 ✓ 正确答案
C 网关不需要处理 CORS 预检
D CORS 响应头重复添加没有影响
#

26. Spring Security 7 的 AuthorizationManager 在 RBAC/ABAC 权限模型的演进

A 统一的 AuthorizationManager 抽象把 URL/方法/对象级授权统一,支持 RBAC 与 ABAC 的组合与扩展 ✓ 正确答案
B Spring Security 7 移除了 AuthorizationManager,改用旧投票机制
C RBAC 与 ABAC 无法在同一框架组合
D 授权决策无法记录审计事件
#

27. Spring Security 与 Spring Modulith 模块间事件总线传递认证上下文时的安全边界如何设计

A 事件应携带完整 Authentication 与用户密码
B 事件总线是授权的决策边界
C 消费方应盲目信任事件携带的权限信息
D 事件只应传递最小身份标识而非完整凭据,消费方对敏感操作仍须独立授权校验 ✓ 正确答案
#

28. Spring Security 与 springdoc-openapi 的安全定义

A 在 OpenAPI 中声明 SecurityScheme(如 bearer JWT)供接口标记,但仅影响文档展示,认证仍由 Spring Security 执行 ✓ 正确答案
B springdoc 配置会替代 Spring Security 的过滤器
C 在 OpenAPI 声明安全方案后,Spring Security 自动启用该认证
D OpenAPI 文档无法展示认证方式
#

29. Spring Security 如何防止会话固定攻击,认证成功后更换 session id 会影响哪些会话属性

A 更换 session id 后原会话属性自动保留,无需考虑
B sessionFixation 默认策略是 none,不安全
C 认证后更换 session id 会泄露用户数据
D 认证成功后更换 session id 使旧 ID 失效,migrateSession 会迁移属性(如 CSRF token、登录状态),newSession 则丢弃属性 ✓ 正确答案
#

30. Spring Security 的 SecurityContextHolder 与 Scoped Values 协同的多线程上下文传播机制

A ScopedValue 与 ThreadLocal 行为完全相同
B ThreadLocal 存储的上下文会自动跨线程传播
C SecurityContextHolder 默认存 ThreadLocal,跨线程需显式传播;虚拟线程下可基于 ScopedValue 提供作用域传播,避免泄漏与串扰 ✓ 正确答案
D 虚拟线程中无需任何处理即可传播 SecurityContext
#

31. Spring Security 的过滤器链顺序与扩展

A 过滤器按固定顺序执行,认证/CSRF/CORS 前置,授权后置,可通过 addFilterBefore/After 插入自定义过滤器 ✓ 正确答案
B 授权过滤器在认证过滤器之前执行
C 自定义过滤器只能加在链末尾
D 过滤器顺序无关紧要
#

32. UserDetailsService 的数据库实现

A UserDetailsService 负责校验密码
B 自定义 loadUserByUsername 查询数据库并映射为 UserDetails,与 PasswordEncoder 配合由 DaoAuthenticationProvider 认证 ✓ 正确答案
C loadUserByUsername 无需返回权限信息
D 用户不存在时返回 null 即可
#

33. WebSecurityCustomizer 与静态资源放行

A ignoring() 仍会经过认证过滤器
B 静态资源必须经过授权才能访问
C WebSecurityCustomizer 的 ignoring() 让静态资源完全绕过安全过滤器链,与 permitAll 进入链后放行不同 ✓ 正确答案
D WebSecurityCustomizer 只能用于认证,不能放行资源
#

34. 使用 Spring Security 6.x 的 SecurityMatcher 与多套 FilterChain 时请求匹配优先级的判定

A 匹配顺序与链顺序无关
B 所有匹配的链都会执行
C 请求按链顺序与各链的 SecurityMatcher 匹配,第一个匹配的链生效,特殊/精确的链应排在前面 ✓ 正确答案
D 兜底链应放在最前面
#

35. 在 K8s 中通过 Spring Security 6.4 读取 ServiceAccount Token 实现工作负载身份认证的机制

A ServiceAccount Token 是明文密码,无需验签
B ServiceAccount Token 无需校验 iss 与 exp
C 该机制只能用于用户登录,不能用于服务间认证
D Pod 挂载的 ServiceAccount Token(JWT)可被 Spring 读取并验签,作为服务间身份认证的凭证 ✓ 正确答案
#

36. 多个 SecurityFilterChain 同时匹配请求时为何只使用第一条链,securityMatcher 与 requestMatchers 如何分工

A 匹配的链都会执行
B securityMatcher 用于配置链内授权规则
C requestMatchers 决定使用哪条链
D 只执行第一条匹配链避免过滤器重复与决策冲突,securityMatcher 决定链归属,requestMatchers 配置链内授权规则 ✓ 正确答案
#

37. 多租户系统如何按 issuer 或请求域选择 AuthenticationManager,同时阻止租户间密钥混用

A 所有租户共享同一密钥认证即可
B 按 iss 路由时无需校验签发者
C 根据请求域或 token 的 iss 选择对应租户的 AuthenticationManager/JwtDecoder,且各租户密钥严格隔离并校验 iss ✓ 正确答案
D 多租户无法使用不同的 JwtDecoder
#

38. 异常响应如何区分未认证与无权限,又避免向攻击者泄露账号、租户或权限策略细节

A 客户端应能区分"用户名不存在"与"密码错误"
B 未认证与无权限都应返回 500
C 未认证返回 401、无权限返回 403,客户端消息应泛化,姓名称/租户/权限策略细节只进服务端日志 ✓ 正确答案
D 错误响应应包含完整堆栈以方便攻击者排查
#

39. 方法级安全依赖代理时,自调用为何可能绕过 @PreAuthorize,接口与实现注解应如何统一

A 自调用 this.method() 绕过代理使授权失效,方法级安全注解应统一放在实现类上并确保通过代理调用 ✓ 正确答案
B 自调用会正常触发方法级安全
C 注解应只放在接口上,实现类无需注解
D 自调用绕过代理是安全的,无需处理
#

40. PasswordEncoder 的升级与历史密码

A 用 DelegatingPasswordEncoder 兼容多算法(前缀标识),登录成功后把旧算法哈希升级为新算法,无需强制重置 ✓ 正确答案
B DelegatingPasswordEncoder 只能支持一种算法
C 切换算法后旧密码必须全部重置
D 升级写回失败应阻断旧密码登录
#

41. Spring Security 6.x 中基于 GraalVM Native Image 反射配置需要哪些元数据声明

A Native Image 运行时反射自动可用,无需声明
B 需要为反射(UserDetails/PasswordEncoder 等)、动态代理(AOP/MethodSecurity)与资源(META-INF/services)声明元数据 ✓ 正确答案
C Spring Security 不依赖反射,无需元数据
D 动态代理在 Native Image 中无需任何配置