@PreAuthorize在一个方法上调用,但不在另一个方法上调用

时间:2011-12-29 23:50:59

标签: java spring spring-security

在我的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

2 个答案:

答案 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方法?

确保您调用它的方式允许代理(即为注释创建的代理)拦截该调用。