在我的spring配置文件中,我有<global-method-security pre-post-annotations="enabled"/>
在我的春天@Controller中我有一个@RequestMapping,其上有一个@PreAuthorize,如下所示:
@PreAuthorize("true == false")
@RequestMapping(value="/image", method=RequestMethod.GET )
@ResponseBody
public ResponseEntity<byte[]> getImage(
@RequestParam(value="imageSet", required=false) Long imageSetKey
, @RequestParam(required=false, defaultValue="70") Integer size
, @RequestParam(required=false) Unit unit
, @RequestHeader( value="if-none-match", required=false ) String etag
)
{
// use the latest and greatest for the unit if they specify the unit, otherwise use the imageSetKey they pass in.
if ( unit != null )
{
return getUnitImage( unit, size, etag );
}
// more code to do other stuff
}
现在评估@PreAuthorize并正常工作。如果我在getUnitImage方法上放置一个PreAuthorize,那么它就不会被评估,我就可以很好地进入方法了。以下是未评估@PreAuthorize的方法。
@PreAuthorize("true == false")
public ResponseEntity<byte[]> getUnitImage( Unit unit, int size, String etag )
{
// do stuff, I get into breakpoints here.
}
为什么使用RequestMapping在一个方法上调用PreAuthorize,而不是在同一个类中的其他方法上调用它?
Spring 3.0.5,Spring Security 3.0.3
答案 0 :(得分:4)
这是由Spring AOP&amp; amp; CGLIB的工作。具体而言,创建了一个扩展实际类的代理类,这就是提供@PreAuthorize行为实现的代理类。当您从同一个类调用一个方法时,它不会通过代理类,因此不会执行所需的行为。
解决这个问题的一种方法是使用AspectJ,方法是将spring =“aspectj”添加到Spring配置中的global-method-security元素中。
@Transactional也会发生这种情况,另外一个关于@Transactional的问题还有关于这个问题的更多细节:
Spring @Transaction method call by the method within the same class, does not work?
答案 1 :(得分:1)
如何调用getUnitImage方法?
确保您调用它的方式允许代理(即为注释创建的代理)拦截该调用。