Spring Security - 使用切入点的全局方法安全性不起作用

标签 spring spring-security spring-aop

我想在我的 Web 应用程序中应用方法级安全性,以便只有授权用户才能访问这些服务层方法。

有两种方法可以实现这一点。

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)

我已经尝试了一切可能的方法来将 pom 文件和 eclipse 项目属性中的代码合规性级别更改为 1.6。

我使用的是Spring-Security 3.0,aspectj相关库如下。

spring-aop-3.1.0.RELEASE.jar

spring-aspects-3.1.0.RELEASE.jar

aspectjrt-1.6.5.jar

aspectjweaver-1.6.5.jar

请在这方面帮助我。如果您需要任何进一步的信息,请询问我。

提前致谢。

最佳答案

您必须配置切面编织器才能使用 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>

关于Spring Security - 使用切入点的全局方法安全性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13264630/

相关文章:

java - 从依赖于其他项目的 Maven 项目构建 jar

java - 使用 JQuery ajax 发布表单数据时出现无效参数错误

java - 如何显示/处理成功/失败错误消息

authentication - 将 Tomcat NTLM 与 Spring Security 结合使用

java - Spring AOP启动时间慢

java - Spring 框架中的切入点在内部如何工作

java - Spring Tool Suite(Eclipse)项目运行问题

java - 是否可以在一个 spring 容器中运行带有 spring security 的 spring webmvc webapp?

java - Spring Security - 简单的 CORS 身份验证错误

java - Spring方面调用接口(interface)方法上的自定义注释