0

難しい問題なので、分かりやすく説明します。にデプロイされた3 つのOSGiバンドルがあります。これらの , ,バンドルで使用されるセキュリティ バンドルもあります。ABCApache KarafABC

ABおよびCbundles には次が含まれます。

<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 SpringBean にはプロトタイプがあり、この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ますが、レルムは常に最初に開始されたバンドルのものであり、正しく機能していません。

どこに問題があるのか​​ 考えている人はいますか?

4

3 に答える 3

0

同じインスタンスがアプリケーション間で共有される理由を理解することができました。私のすべてのバンドルABおよびC、はこれを使用しました:

<httpj:engine-factory bus="cxf">
    <httpj:engine port="8020">
        <httpj:threadingParameters minThreads="5" maxThreads="15"/>
        <httpj:handlers>
            <ref bean="securityHandler"/>
            <ref bean="ipFilteringHandler"/>
        </httpj:handlers>
        <httpj:sessionSupport>true</httpj:sessionSupport>
    </httpj:engine>
</httpj:engine-factory>

セキュリティハンドラーを作成し、それらすべてに対してJetty同じポートを使用しました8020。また、同じポートで異なるハンドラーを処理することはできませんでした。ポートをすべて異なるものに変更すると、すべてが機能しました。しかし、それは私にとっての解決策ではありませんでした。解決策は、すべてのバンドルで使用される1つのレルムを作成することでした。

于 2012-09-24T08:21:14.670 に答える
0

AFAIR ここでの問題は、Spring がプロキシを行う方法です。原因は、サービスではなくサービス参照に対してプロキシが行われていることです。適切なプロキシを使用するには、おそらく正しく構成する必要があります。

おそらく次のようなものが役立つと思います。

ServiceReference nativeReference = ((ServiceReferenceProxy)serviceReference).getTargetServiceReference() 
于 2012-09-24T08:38:56.773 に答える
0

問題は、beanFactory から単一の「securityHandler」を取得することです。したがって、共有インスタンスは 1 つだけです。createSecurityHandler 内で、新しいオブジェクトを作成して返す必要があります。

于 2012-09-22T07:15:02.807 に答える