Проблема со сбором контекста AspectJ pointcut и избеганием упоминания всех аргументов рекомендованного метода

Я использую AspectJ, чтобы проверить, принадлежит ли объект текущему пользователю. Рекомендуемый метод на самом деле является методом контроллера Spring MVC. Я использую аннотацию, размещенную на этом методе контроллера, чтобы применить сквозную рекомендацию по безопасности.

У меня проблема в том, что метод контроллера имеет довольно много аргументов. Я хотел бы избежать упоминания всех аргументов в источнике aspectJ, потому что они могут измениться (имя аргумента, тип и т. Д.), Но мне все равно придется собирать контекст pointcut.

Для суммирования N аргументов, присутствующих в методе, мне нужно использовать только два (member и advertisingId). Как я могу избежать упоминания N аргументов?

Мой pointcut:

public pointcut advertisementBelongsToMemberControllerCheck(FamilyAdvertisementInfo familyAdvertisementInfo, long advertisementId, Model model, Member member) 
        : execution(@AdvertisementExistsAndBelongsToMemberCheck * * (..)) 
        && args(familyAdvertisementInfo,advertisementId, model,  member);

Мой совет:

before(FamilyAdvertisementInfo familyAdvertisementInfo, long advertisementId, Model model, Member member) : advertisementBelongsToMemberControllerCheck(familyAdvertisementInfo,advertisementId, model,  member) {
        if (!advertisementService.advertisementExistsAndBelongsToMember(advertisementId, member)) {
            throw new AccessDeniedException("Advertisement does not belong to member!");
        }
    }

Аннотация:

@Retention(RetentionPolicy.RUNTIME)
public @interface AdvertisementExistsAndBelongsToMemberCheck {

}

И, наконец, рекомендованный метод контроллера:

@RequestMapping(value = "/family/edit/{advertisementId}", method = RequestMethod.GET, produces = "text/html")
@AdvertisementExistsAndBelongsToMemberCheck
public String editFamilyAdvertisementForm(@ModelAttribute FamilyAdvertisementInfo familyAdvertisementInfo, @PathVariable long advertisementId, Model model, @CurrentMember Member member/* the currently logged in user */) {
        FamilyAdvertisement advertisement = advertisementService.findFamilyAdvertisement(advertisementId);
        familyAdvertisementInfo.setFamilyAdvertisement(advertisement);
        populateFamilyAdvertisementModel(model, familyAdvertisementInfo, member);
        return "advertisement/family/edit";
    }

1 ответ

Решение

На всякий случай, если кому-то интересно, мне дали ответ на мой вопрос. Вот:

Мой pointcut:

public pointcut advertisementBelongsToMemberControllerCheck(long advertisementId, Member member) 

: execution(@AdvertisementExistsAndBelongsToMemberCheck * * (..)) 
        && args(*, advertisementId, *, member, ..);

Мой совет:

before(long advertisementId, Member member) : advertisementBelongsToMemberControllerCheck(advertisementId, member) {

        if (!advertisementService.advertisementExistsAndBelongsToMember(advertisementId, member)) {
            throw new AccessDeniedException("Advertisement does not belong to member!");
        }
    }

Это работает, и это намного чище.

Другие вопросы по тегам