2012-11-07 76 views
3

我想在我的Web應用程序中應用方法級安全性,以便只有授權用戶才能訪問這些服務層方法。Spring Security - 全局方法使用切點的安全性不起作用

有兩種實現方法。

1)使用@Secured註釋註釋我的服務層方法,並在具有配置(<security:global-method-security secured-annotations="enabled" />)的dispatcher-servlet.xml文件中註釋。

但在我的情況下,這會花費很多時間,因爲已經創建了很多服務類和方法,因此找到方法並註釋它們不是一個好方法。

2)要定義方法級別安全性的減法表達式,它將自動檢測我的服務中具有自定義註釋@SecuredAdmin的方法,並使用角色ROLE_ADMIN保護它們。

在我的情況下,當我嘗試測試時,選項1)工作得很好。沒有問題。但是當我嘗試使用以下配置的選項2)時,我無法啓動我的應用程序。

<security:global-method-security> 
     <security:protect-pointcut access="ROLE_ADMIN" expression="execution(@com.xxx.yyy.zzz.services.SecuredAdmin * *.*(..))"/> 
    </security:global-method-security> 

當我嘗試啓動我的服務器時出現以下異常。

java.lang.IllegalArgumentException: error annotation type patterns are only supported at Java 5 compliance level or above 
    org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:302) 
    org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:279) 
    org.springframework.security.config.method.ProtectPointcutPostProcessor.postProcessBeforeInitialization(ProtectPointcutPostProcessor.java:94) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:394) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1448) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    org.springframework.context.support.AbstractApplicationContext.initMessageSource(AbstractApplicationContext.java:773) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:452) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333) 
    org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    java.lang.Thread.run(Unknown Source) 

我已經盡一切可能將代碼合規性級別更改爲1.6在pom文件和eclipse項目屬性中。

我正在使用Spring-Security 3.0和與aspectj相關的庫如下。

彈簧AOP-3.1.0.RELEASE.jar

彈簧方面-3.1.0.RELEASE.jar

aspectjrt-1.6.5.jar

aspectjweaver-1.6.5 .jar

請在這方面給我幫助。詢問我是否需要更多信息。

在此先感謝。

回答

2

您必須配置方面編織器以使用java 1.6合規性級別。在構建插件部分添加類似於你的pom.xml的東西。

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <version>1.4</version> 
    <executions> 
     <execution> 
     <goals> 
      <goal>compile</goal> 
      <goal>test-compile</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     <encoding>UTF-8</encoding> 
     <aspectLibraries> 
     <aspectLibrary> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aspects</artifactId> 
     </aspectLibrary> 
     </aspectLibraries> 
    </configuration> 
</plugin> 
+0

謝謝。讓我試試看,我會盡快回復你。 –

+0

我已經包含了這個插件我的pom.xml,但沒有運氣。我的應用程序有三個maven模塊。兩個模塊打包爲jar,這兩個模塊都包含在第三個打包爲war的模塊中。所有這三個模塊都是以pom打包的maven項目的一部分。你認爲我應該把這個插件配置在哪裏?我仍然收到同樣的錯誤。 –

+0

在每個使用方面的項目中。 –

2

我碰到這個問題的時候,一種舊的項目 - 當我從JDK6到JDK7,切換時,應用程序啓動我遇到:

'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource' 
while setting bean property 'transactionAttributeSource'; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0': 
Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: 
error annotation type patterns are only supported at Java 5 compliance level or above 

我不想純粹的Maven的解決方案,因爲在開發我通過IDE(Intellij IDEA)在Tomcat中運行應用程序。

在我升級我的aspectjweaver依賴於1.7.2結束(這是1.5.4)

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.7.2</version> 
</dependency> 

一切現在看來還好。

相關問題