Sho*_*orn 8 spring spring-security
我最近将一个项目从使用 spring-security 升级6.0.0-M6
到gradle 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
调用该方法以使我的安全配置正常工作?
我的解决方法是忽略弃用警告。
首先,您的安全配置不指定任何类型的身份验证,例如httpBasic
、formLogin
等。AuthenticationManager
由这些身份验证机制创建的过滤器调用 来验证凭据。
其次,应用程序可能无意中依赖FilterSecurityInterceptor
( authorizeRequests
) 来验证用户身份,而authorizeHttpRequests
. 您需要声明一个身份验证机制,用于从请求中收集凭据并对用户进行身份验证。
由于您使用的是 JWT,因此您可能需要考虑 Spring Security 的OAuth2 资源服务器支持。您还可以参考我们的示例存储库,以帮助您完成示例配置。
归档时间: |
|
查看次数: |
2439 次 |
最近记录: |