Spring-security 6 - 403 被拒绝,因为未调用 AuthenticationProvider

Sho*_*orn 8 spring spring-security

我最近将一个项目从使用 spring-security 升级6.0.0-M6gradle config6.0.0(如果您想查看的话)。该项目没有使用spring-boot。

语境

我的securityFilterChain是通过代码配置的,看起来大约像这样:

http.
  authenticationManager(authnManager).
  securityContext().securityContextRepository(securityRepo).
and().
  authorizeRequests(). // <-- DEPRECATED
    requestMatchers(RAID_V2_API + "/**").fullyAuthenticated().

Run Code Online (Sandbox Code Playgroud)

从 FilterChain config 开始的完整代码库是公开的。

请注意, 的用法WebSecurityConfigurerAdapter 已被弃用,并且自从最初使用 . 以来我就没有再使用过它6.0.0-M6。所以调用类似的东西WebSecurityConfigurerAdapter.authenticationManagerBean()是行不通的。

这段代码工作正常,但调用会authorizeRequests()导致我想摆脱的弃用警告。

问题

弃用标签表明我应该使用authorizeHttpRequests()它,但是当我这样做时 - 需要授权的请求(通过fullyAuthenticated()上面的规范)将被拒绝,并出现 403 错误。

分析

发生这种情况似乎是因为我的AuthenticationProvider实例没有被调用,因为ProviderManager没有被调用。由于 AuthnProviders 不会被调用,安全上下文仍然包含预身份验证令牌,而不是经过验证的后身份验证令牌,因此最终调用最终会调用AuthorizationStrategy.isGranted()isAuthenticated()身份验证令牌,该令牌(正确地)返回 false 和请求被拒绝。

问题

如何使用该authorizeHttpRequests()方法但仍然可以ProviderManager调用该方法以使我的安全配置正常工作?

我的解决方法是忽略弃用警告。

Mar*_*gio 3

首先,您的安全配置不指定任何类型的身份验证,例如httpBasicformLogin等。AuthenticationManager由这些身份验证机制创建的过滤器调用 来验证凭据。

其次,应用程序可能无意中依赖FilterSecurityInterceptor( authorizeRequests) 来验证用户身份,而authorizeHttpRequests. 您需要声明一个身份验证机制,用于从请求中收集凭据并对用户进行身份验证。

由于您使用的是 JWT,因此您可能需要考虑 Spring Security 的OAuth2 资源服务器支持。您还可以参考我们的示例存储库,以帮助您完成示例配置。