Spring Security:如何访问AuthenticationManagerResolver中的request隐式对象?
如何理解Spring Security中AuthenticationManagerResolver的lambda参数,并访问request对象?
问题描述
我想了解如何访问隐式对象,在Spring Security官方文档的《OAuth 2.0 Resource Server Multi-tenancy》章节中给出了如下示例代码:
@Bean AuthenticationManagerResolver<HttpServletRequest> tokenAuthenticationManagerResolver (JwtDecoder jwtDecoder, OpaqueTokenIntrospector opaqueTokenIntrospector) { AuthenticationManager jwt = new ProviderManager(new JwtAuthenticationProvider(jwtDecoder)); AuthenticationManager opaqueToken = new ProviderManager( new OpaqueTokenAuthenticationProvider(opaqueTokenIntrospector)); return (request) -> useJwt(request) ? jwt : opaqueToken; }
阅读这段代码时我产生困惑:lambda表达式中的request参数并未传入该方法,请问该从哪些方面入手理解?我需要访问该request对象来进一步实现逻辑。
解答
1. 理解lambda参数的来源
这个lambda表达式本质是实现了AuthenticationManagerResolver<HttpServletRequest>接口的resolve(HttpServletRequest request)方法。该request参数不是由你手动传入的,而是在运行时由Spring Security自动传递:
- 当请求进入资源服务器时,Spring Security的过滤器链会调用这个Resolver的
resolve方法,并将当前请求对应的HttpServletRequest实例作为参数传入。 - 你写的lambda只是对
resolve方法的简化实现,不需要手动处理参数传递,只需要定义如何使用这个参数即可。
2. 如何访问request实现自定义逻辑
你可以直接在lambda中使用这个request参数来获取请求相关的信息,比如请求头、请求路径、请求参数等,以此来扩展你的多租户或认证逻辑。举个例子:
@Bean AuthenticationManagerResolver<HttpServletRequest> tokenAuthenticationManagerResolver (JwtDecoder jwtDecoder, OpaqueTokenIntrospector opaqueTokenIntrospector) { AuthenticationManager jwt = new ProviderManager(new JwtAuthenticationProvider(jwtDecoder)); AuthenticationManager opaqueToken = new ProviderManager( new OpaqueTokenAuthenticationProvider(opaqueTokenIntrospector)); return (request) -> { // 从请求头获取租户ID String tenantId = request.getHeader("X-Tenant-ID"); // 根据租户ID选择对应的认证管理器 if ("tenant-a".equals(tenantId)) { return jwt; } else { return opaqueToken; } }; }
3. 核心逻辑梳理
AuthenticationManagerResolver的作用是根据当前请求动态选择合适的AuthenticationManager。- Spring Security负责在请求处理流程中触发这个Resolver,并传入当前请求对象,你只需要专注于利用request信息做决策即可。
内容的提问来源于stack exchange,提问作者robinmanz
相关产品推荐
相关产品推荐

