这是一个复杂的问题,所以我会尽可能清楚地解释它。我有三个OSGi
捆绑包A
,B
部署C
到Apache Karaf
. 我还有一个安全捆绑包,这些A
捆绑包使用它B
。C
每个A
,B
和C
bundles 都包含以下内容:
<osgi:reference id="basicAuthHandlerFactory" interface="com.groupgti.security.handler.basicauth.BasicAuthHandlerFactory"/>
<bean id="securityHandler" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="basicAuthHandlerFactory"/>
<property name="targetMethod" value="createSecurityHandler"/>
<property name="arguments">
<list>
<value type="java.lang.String">A.realm</value> <!-- The realm is depending on a bundle, A.realm, B.realm, C.realm -->
</list>
</property>
</bean>
Spring
从安全包中获取安全处理程序的代码片段。安全包中的此处理程序作为OSGi
服务公开并在安全包中创建,如下所示:
<bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler" scope="prototype">
<property name="authenticator">
<bean class="org.eclipse.jetty.security.authentication.BasicAuthenticator"/>
</property>
<property name="constraintMappings">
<list>
<ref bean="constraintMapping"/>
</list>
</property>
<property name="strict" value="false"/>
<property name="identityService" ref="identityService"/>
</bean>
<bean id="basicAuthSecurityHandler" class="com.groupgti.security.handler.basicauth.BasicAuthFactoryHandlerImpl"/>
<osgi:service ref="basicAuthSecurityHandler" interface="com.groupgti.security.handler.basicauth.BasicAuthHandlerFactory"/>
BasicAuthFactoryHandlerImpl#createSecurityHandler(String realm)
用于为每个捆绑包创建不同的安全处理程序实例。如上面的代码所示,当createSecurityHandler
方法被调用时,领域由包传递。Spring
MethodInvokingFactoryBean
securityHandler
Spring
bean 有一个原型,在这种scope
情况下,每次调用该方法时,都会getBean
返回一个新创建的对象。
我为安全处理程序设置的领域是这样的:
public class BasicAuthFactoryHandlerImpl implements BeanFactoryAware, BasicAuthHandlerFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(BasicAuthFactoryHandlerImpl.class);
private BeanFactory factory;
@Override
public ConstraintSecurityHandler createSecurityHandler(String realm) {
ConstraintSecurityHandler handler = (ConstraintSecurityHandler) factory.getBean("securityHandler");
handler.setUserRealm(realm);
LOGGER.debug("Security handler created. Got realm: {}", realm);
return handler;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.factory = beanFactory;
}
}
创建每个捆绑包的处理程序,一切都很好。但问题是所有捆绑包的领域在某种程度上与从第一个启动捆绑包传递的领域相同。我确信我Spring
在不同捆绑包中的每个配置中传递了不同的领域,但领域总是来自第一个启动的捆绑包并且它无法正常工作。
有人知道问题出在哪里吗?