승인 된 사용자 만이 서비스 계층 메소드에 액세스 할 수 있도록 웹 애플리케이션에서 메소드 레벨 보안을 적용하려고합니다.스프링 보안 - 전역 메소드 포인트 컷을 사용한 보안이 작동하지 않습니다.
구현 방법에는 두 가지가 있습니다.
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
이 점에 대해 도움을주십시오. 더 자세한 정보가 필요하면 저에게 물어보십시오. 사전에
감사합니다.
감사합니다. 그것을 시도하자. 그리고 나는 당신에게 앙갚음을 할 것이다. –
이 플러그인을 pom.xml에 포함 시켰지만 운이 없습니다. 내 응용 프로그램에는 세 가지 maven 모듈이 있습니다. 두 개의 모듈은 jar로 패키징되며 두 모듈은 전쟁으로 패키징 된 세 번째 모듈에 포함됩니다. 그리고이 세 모듈은 모두 pom으로 패키지 된 maven 프로젝트의 일부입니다. 이 플러그인 구성을 어디에 두어야한다고 생각합니까? 나는 여전히 같은 오류가 발생합니다. –
aspect를 사용하는 모든 프로젝트에서. –