Java8下jee-pac4j 5.0.1-SNAPSHOT动态Scope注入方案求助
解决方案
问题根源
你当前代码的核心问题是:每次调用configFactory.build("openid profile")都会创建全新的Config、Clients及客户端实例,你修改的只是这个临时对象里的GoogleOidcClient配置,而应用实际运行时使用的是之前初始化好的客户端实例,所以修改不会生效。
可行方案
1. 复用已初始化的客户端实例
修改DemoConfigFactory,不要每次build都创建新客户端,而是缓存客户端实例,后续直接修改缓存的实例配置:
public class DemoConfigFactory extends ConfigFactory { // 缓存GoogleOidcClient实例 private GoogleOidcClient googleOidcClient; @Override public Config build(final String parameters) { if (googleOidcClient == null) { // 仅第一次初始化时创建客户端 OidcConfiguration oidcConfiguration = new OidcConfiguration(); oidcConfiguration.setClientId("your-client-id"); oidcConfiguration.setClientSecret("your-client-secret"); oidcConfiguration.setDiscoveryURI("https://accounts.google.com/.well-known/openid-configuration"); oidcConfiguration.setScope("openid profile"); // 默认Scope googleOidcClient = new GoogleOidcClient(oidcConfiguration); } Clients clients = new Clients("http://localhost:8080/callback", googleOidcClient); return new Config(clients); } // 提供获取GoogleOidcClient的方法 public GoogleOidcClient getGoogleOidcClient() { return googleOidcClient; } }
2. 修改Scope的正确代码
现在直接操作缓存的客户端实例,而不是每次build新的Config:
// 获取已缓存的GoogleOidcClient实例 GoogleOidcClient oidcClient = configFactory.getGoogleOidcClient(); if (oidcClient != null) { // 直接修改配置的Scope oidcClient.getConfiguration().setScope(selectedScope); }
3. 确保修改生效的注意事项
- 若应用已经初始化了
Config实例(比如在Filter或Servlet中),需要确保后续认证请求使用的是修改后的客户端配置。由于jee-pac4j的客户端配置是动态生效的,修改后下一次认证请求就会使用新的Scope。 - 如果你的应用是通过依赖注入框架管理Config和客户端,需要确保注入的是同一个单例实例,避免每次注入都创建新对象。
内容的提问来源于stack exchange,提问作者rithvik
相关产品推荐
相关产品推荐

