Spring @Secured和@PreAuthorize对普通(非Web)应用程序没有任何影响

我用两个安全的方法创建了一个Application Spring组件:

 @Component public class Application { public void run() { onlyAdminMethod(); onlyAdminMethod2(); } @Secured( "ROLE_ADMIN" ) public void onlyAdminMethod() { System.out.println( "Admin-only method called" ); } @PreAuthorize( "hasRole('ROLE_ADMIN')" ) public void onlyAdminMethod2() { System.out.println( "Admin-only method 2 called" ); } } 

我在该bean上调用run()方法,我从Spring XML上下文中获取:

 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); context.getBean( Application.class).run(); 

没有发生 –即使没有身份validation和SecurityContextHolder.getContext().getAuthentication() 方法也会正常调用 SecurityContextHolder.getContext().getAuthentication()返回null

我的Spring XML

           

我在Spring 3.2.4使用Maven依赖项

2件事

Spring为AOP使用基于代理的解决方案。 这意味着只拦截外部方法调用,您正在进行内部方法调用,并绕过代理。

第二,确保使用基于类的代理(您没有使用接口,因此JDK Dynamic Proxies不起作用)。 将proxy-target-class="true"元素。 确保在类路径上有cglib,因为这是基于类的代理所必需的。