難しい問題なので、分かりやすく説明します。にデプロイされた3 つの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
ますが、レルムは常に最初に開始されたバンドルのものであり、正しく機能していません。
どこに問題があるのか 考えている人はいますか?