WSO2 身份服务器自定义租户侦听器

WSO2 Identity Server custom Tenant Listener

我正在尝试向 WSO2 Identity Server 引入自定义租户侦听器,以便挂接租户创建并应用我需要的一些通用配置,这些配置将在我的服务器上创建的所有租户(例如一些常见角色,一个普通的二级用户存储等)。

经过一些挖掘,我最终扩展了 AbstractIdentityTenantMgtListener,因为我找不到任何关于我正在做的事情的文档(我看过用户存储监听器的文档,但它没有'这似乎是一回事)我最终创建了一个 OSGI 组件并将其添加到 drop-ins 但我的问题是当我的服务被注册时,它不活跃并且不会被调用任何时候。

目前我拥有的东西很少,只是为了调用钩子。像这样:

/**
 * @scr.component name="org.wso2is.tenantlistener.internal.TenantListenerServiceComponent" *
 *     immediate="true"
 */
public class TenantListenerServiceComponent {

    private static Log log = LogFactory.getLog(TenantListenerServiceComponent.class);

    protected void activate(ComponentContext context) {
        log.info("Trying to activate Tenant Listener");
        try {
        BundleContext bundleContext = context.getBundleContext();
            MyTenantListener listener = new MyTenantListener();
            ServiceRegistration<?> serviceRegistration = bundleContext.registerService(
                MyTenantListener.class.getName(), listener, null);
        log.info("Tenant Listener bundle is activated with id: " + serviceRegistration.getReference().getBundle().getBundleId());
        } catch (Throwable e) {
            log.fatal("----Error while activating Tenant listener----", e);
        }
    }

    protected void deactivate(ComponentContext context) {
        log.info("Tenant Listener bundle is de-activated");
    }

}
public class MyTenantListener extends AbstractIdentityTenantMgtListener {

    private static final Log log = LogFactory.getLog(MyTenantListener.class);

    @Override
    public void onTenantCreate(TenantInfoBean tenantInfoBean) throws StratosException {
        log.info("Hooking on tenant creation!! Received a new tenant: " + tenantInfoBean.getTenantId() + ", " + tenantInfoBean.getTenantDomain());
    }

    @Override
    public int getListenerOrder() {
        return 999;
    }

}

此外,我的包配置如下所示:

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <version>4.2.1</version>
  <extensions>true</extensions>
  <configuration>
    <instructions>
      <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
      <Bundle-Name>${project.artifactId}</Bundle-Name>
      <Private-Package>org.wso2is.tenantlistener.internal</Private-Package>
      <Import-Package>org.osgi.framework,javax.servlet,
        javax.servlet.http,
        *;resolution:=optional
      </Import-Package>
      <Export-Package>!org.wso2is.tenantlistener.internal,org.wso2is.tenantlistener.*;</Export-Package>
      <DynamicImport-Package>*</DynamicImport-Package>
    </instructions>
  </configuration>
</plugin>

我什至尝试将我的听众添加到我的 deployment.toml 中,如下所示,但一无所获:

[[event_handler]]
name= "org.wso2is.tenantlistener.MyTenantListener"

有没有人尝试过类似的成功(让自定义租户侦听器实际被调用)?这可能是我遗漏但无法弄清楚的一些细节。

在 WSO2 的存储库中进行了一些额外的挖掘之后,更具体地说,我终于找到了答案 this PR 帮助我确定了我的问题。

仅供可能面临类似问题的其他人参考,问题是我如何注册我的服务。我应该使用 TenantMgtListener 的接口,而不是使用我的具体实现的名称。

所以 TenantListenerServiceComponent::activate 上的服务注册行应该是:

 ServiceRegistration<?> serviceRegistration = bundleContext.registerService(TenantMgtListener.class.getName(), listener, null);