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);
我正在尝试向 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);