2012-11-28 212 views
2

我想在处女座3.6.0.M03上使用Spring Security 3.1.3创建一个简单的例子。 该示例包含的3束:Spring Security和OSGi

  • 安全束配置和发布的AuthenticationManager

    <security:authentication-manager id="authenticationManager"> 
        <security:authentication-provider> 
         <security:user-service> 
         <security:user name="Rigas" password="password" authorities="ROLE_MEMBER"/> 
         </security:user-service> 
        </security:authentication-provider> 
    </security:authentication-manager> 
    <service id="authenticationManagerOsgi" ref="authenticationManager" interface="org.springframework.security.authentication.AuthenticationManager"/> 
    
  • helloSecurity束发布一个安全的helloWorld方法。它引用AuthenticationManager并将其注入全局方法安全性中。

    <security:global-method-security secured-annotations="enabled" authentication-manager-ref="authenticationManager"/> 
    <reference id="authenticationManager" availability="mandatory" interface="org.springframework.security.authentication.AuthenticationManager"/> 
    <service id="helloSpringSecurityOsgi" ref="helloSpringSecurity" interface="net.ansible.examples.hellospringsecurity.HelloSpringSecurity" /> 
    
  • helloSecurityConsumer束引用helloSecurity IF和调用安全的helloWorld方法。

    <reference id="helloSpringSecurity" availability="mandatory" interface="net.ansible.examples.hellospringsecurity.HelloSpringSecurity"/> 
    

捆绑statup和线路正常工作,但一旦helloSecurityConsumer调用的安全方法如下异常被抛出:

Failed to call secure method org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'authenticationManager' must be of type [org.springframework.security.authentication.ProviderManager], but was actually of type [$Proxy94] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:360) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.security.config.method.GlobalMethodSecurityBeanDefinitionParser$AuthenticationManagerDelegator.authenticate(GlobalMethodSecurityBeanDefinitionParser.java:386) 
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.authenticateIfRequired(AbstractSecurityInterceptor.java:316) 
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:202) 
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:60) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622) 
at net.ansible.examples.hellospringsecurity.impl.HelloSpringSecurityImpl$$EnhancerByCGLIB$$99e49c75.sayHello(<generated>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319) 
at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56) 
at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) 
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) 
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
at $Proxy95.sayHello(Unknown Source) 
at net.ansible.examples.hellospringsecurityconsumer.impl.HelloSpringSecurityConsumerImpl$MyRunnable.run(HelloSpringSecurityConsumerImpl.java:50) 
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source) 
at java.util.concurrent.FutureTask.runAndReset(Unknown Source) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(Unknown Source) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(Unknown Source) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

GlobalMethodSecurityBeanDefinitionParser试图使用引用的AuthenticationManager和有问题转换将OSGi参照代理转发给ProviderManager。 调试显示Proxy(一个jdkDynamicAopProxy)确实是一个围绕ProviderManager类的代理,并具有所有相关的接口。 是否有工作配置来实现我想要做的事情?

回答

4

这看起来像一个错误给我。引发此错误的文件GlobalMethodSecurityBeanDefinitionParser.java的386线是

delegate = beanFactory.getBean(authMgrBean, ProviderManager.class); 

它要求bean工厂与具体实施ProviderManager的豆,但它应该只是获取一个bean实例与接口AuthenticationManager这样的:

delegate = beanFactory.getBean(authMgrBean, AuthenticationManager.class); 

您可能想要在Spring Security's Jira中提高门票。

顺便说一句:我们还将导出authenticationManager作为OSGI服务并在其他包中使用它,这非常有效。

+0

我只记得我刚才打开了一个bug报告,它有类似的问题:https://jira.springsource.org/browse/SEC-1842 (http://forum.springsource.org/showthread。 PHP?116363)。我们也遇到了一个需要ProviderManager实例的问题,而不仅仅是一个AuthenticationManager实现。因此,在代码中可能会有其他地方使用ProviderManager而不是AuthenticationManager。 – James

+0

你说得对。修补GlobalMethodSecurityBeanDefinitionParser使一切正常工作。 –