Из-за чего не работает @EnableMethodSecurity(mode=AdviceMode.ASPECTJ)?

Ссылка скопирована
1 ответ

По вводным: при активации режима AspectJ в Spring Security
@EnableMethodSecurity(mode=AdviceMode.ASPECTJ)

Выбрасывает исключение:
По вводным: caused by: java.lang.ClassNotFoundException: org.springframework.security.authorization.method.aspectj.PreFilterAspect

Нужно понять: откуда взять этот класс? Какую зависимость нужно добавить?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

@EnableMethodSecurity(mode=AdviceMode.ASPECTJ) не работает, если в проекте не настроено реальное AspectJ weaving. Это частая путаница: режим PROXY работает через Spring AOP proxies, а режим ASPECTJ требует compile-time или load-time weaving. Просто указать mode=ASPECTJ недостаточно.

Если вам не нужен именно AspectJ, используйте режим по умолчанию:

@Configuration
@EnableMethodSecurity
public class SecurityConfig {
}

@Configuration @EnableMethodSecurity public class SecurityConfig { }

Он покрывает большинство сценариев @PreAuthorize, @PostAuthorize, @Secured. Но у proxy-режима есть ограничения: не срабатывает self-invocation, final/private методы и вызовы внутри того же объекта.

Если нужен AspectJ, придется настроить зависимости и weaving. Для load-time weaving нужен javaagent:

-javaagent:/path/to/aspectjweaver.jar

-javaagent:/path/to/aspectjweaver.jar

И конфигурация LTW в Spring. Также нужны соответствующие зависимости AspectJ. Без этого аннотации безопасности просто не будут перехватывать вызовы так, как вы ожидаете.

  • для обычного Spring Boot оставьте proxy-режим;
  • если не работает self-invocation, вынесите метод в другой bean;
  • проверьте, что метод public и вызывается через Spring bean;
  • включите debug-логи Spring Security Method Security;
  • не включайте ASPECTJ без понимания weaving.

Практически я бы сначала проверил, срабатывает ли @PreAuthorize в стандартном режиме. Если да, проблема не в безопасности, а в выбранном mode. Если не срабатывает и в стандартном режиме, проверьте, что включен Spring Security, пользователь аутентифицирован, выражение корректное, а метод вызывается через Spring-контейнер, а не через new.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно