我使用两种安全方法创建了一个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();
即使没有身份验证且SecurityContextHolder.getContext().getAuthentication()
返回null
我的Spring XML :
<context:annotation-config />
<context:component-scan base-package="practice" />
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="admin" password="stackoverflow" authorities="ROLE_USER,ROLE_ADMIN" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>
我对Spring 3.2.4
答案 0 :(得分:3)
2件事
Spring为AOP使用基于代理的解决方案。这意味着只拦截外部方法调用,您正在进行内部方法调用,并绕过代理。
其次要确保您使用的是基于类的代理(您没有使用接口,因此JDK Dynamic Proxies不起作用)。将proxy-target-class="true"
添加到您的<global-method-security .. />
元素。确保在类路径上有cglib,因为这是基于类的代理所必需的。