Проблема со сбором контекста 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!");
}
}
Это работает, и это намного чище.