2012-11-07 4 views
3

승인 된 사용자 만이 서비스 계층 메소드에 액세스 할 수 있도록 웹 애플리케이션에서 메소드 레벨 보안을 적용하려고합니다.스프링 보안 - 전역 메소드 포인트 컷을 사용한 보안이 작동하지 않습니다.

구현 방법에는 두 가지가 있습니다.

1) 서비스 레이어 메소드에 @Secured 주석을 달고 dispatcher-servlet.xml 파일에 구성 (<security:global-method-security secured-annotations="enabled" />)으로 주석을 추가하십시오.

그러나 많은 경우 서비스 클래스와 메소드가 이미 생성되어 있으므로 메소드를 찾고 주석을 달아주는 것이 좋은 방법이 아니므로 많은 시간이 걸릴 것입니다.

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) 

나는 pom 파일과 Eclipse 프로젝트 속성 모두에서 코드 준수 수준을 1.6으로 변경할 수있는 가능한 모든 방법을 시도해 왔습니다.

저는 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

자바 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로 패키징되며 두 모듈은 전쟁으로 패키징 된 세 번째 모듈에 포함됩니다. 그리고이 세 모듈은 모두 pom으로 패키지 된 maven 프로젝트의 일부입니다. 이 플러그인 구성을 어디에 두어야한다고 생각합니까? 나는 여전히 같은 오류가 발생합니다. –

+0

aspect를 사용하는 모든 프로젝트에서. –

2

나는 이전 프로젝트와 함께이 문제를 건너 왔어요 - 나는 jdk7하는 JDK6에서 전환 할 때 응용 프로그램이 I가 발생하기 시작했을 때 :

'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 

나는 동안 때문에 순수 받는다는 솔루션을 원하지 않았다 개발 IDE (Intellij IDEA)를 통해 Tomcat에서 앱을 실행합니다. 난 그냥 1.7.2 내 aspectjweaver 종속성을 업그레이드 결국

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

모든 것이 지금은 좋아 보인다 (이것은 1.5.4이었다).

관련 문제