@PreAuthorize вызывается для одного метода, но не для другого - PullRequest
0 голосов
/ 30 декабря 2011

В моем весеннем конфигурационном файле у меня есть <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 оценивается и работает правильно. Если я добавлю PreAuthorize в метод getUnitImage, то он не будет оценен, и я вхожу в метод просто отлично. Вот метод, по которому @PreAuthorize НЕ оценивается.

@PreAuthorize("true == false")
public ResponseEntity<byte[]> getUnitImage( Unit unit, int size, String etag )
{
    // do stuff, I get into breakpoints here.
}

Мысли о том, почему PreAuthorize будет вызываться для одного метода с RequestMapping, а не для других в том же классе?

Spring 3.0.5, Spring Security 3.0.3

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Это вызвано тем, как работают Spring AOP и CGLIB. В частности, создается прокси-класс, который расширяет ваш фактический класс, и именно это обеспечивает реализацию поведения @PreAuthorize. Когда вы вызываете метод из того же класса, он не проходит через прокси-класс, и, следовательно, требуемое поведение не выполняется.

Один из способов справиться с этим - использовать AspectJ, добавив mode = "aspectj" к элементу global-method-security в вашей конфигурации Spring.

Это также происходит с @Transactional, и у другого вопроса, конкретно касающегося @Transactional, есть еще несколько деталей относительно этой проблемы:

Вызов метода Spring @Transaction для метода из того же класса, не работает?

1 голос
/ 30 декабря 2011

Как вызывается метод getUnitImage?

Убедитесь, что способ, которым вы звоните, позволяет прокси-серверу (то есть прокси-серверу, созданному для аннотаций) перехватывать вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...