Как реализовать безопасность на основе аннотаций с помощью Spring AOP?

Я новичок в Spring AOP (и AOP в целом), мне нужно реализовать следующее:

@HasPermission(operation=SecurityOperation.ACTIVITY_EDIT, object="#act")
public Activity updateActivity(Activity act)
{
   ...
}

@HasPermission — это моя пользовательская аннотация, которая будет использоваться для пометки всех методов, требующих предварительной авторизации. Я использую собственную реализацию проверок безопасности на основе Apache Shiro. Как правило, я предполагаю, что мне нужно будет определить pointcut, который соответствует всем аннотированным методам, а также обеспечить реализацию аспекта (либо до, либо вокруг).

У меня есть вопросы. реализация аспекта.

  • Как извлечь из аннотации параметры operation и object?
  • Как я могу разрешить выражение SpEL в определении объекта и передать объект как параметр «act»?

person Sergey Makarov    schedule 29.07.2013    source источник
comment
Ищу ту же тему. Я надеялся, что у Spring будут правильные аннотации AOP/security вместо использования пользовательских аннотаций. Похоже, я нашел учебник, который можно адаптировать к вашему случаю java.dzone.com/ статьи / spring-aop-security   -  person usr-local-ΕΨΗΕΛΩΝ    schedule 22.08.2013
comment
Пожалуйста, проверьте мой ответ - он позволяет получить информацию о методе для обработки пользовательских аннотаций stackoverflow.com/a/13420500/241986   -  person Boris Treukhov    schedule 29.10.2015


Ответы (1)


Я знаю, что это поздний ответ, но после того, как мы перенесли какой-то проект JavaEE на Spring, мы создали базовую модель безопасности на основе AspectJ:

Во-первых, мы аннотируем наши сервисные методы пользовательской @OperationAuthorization:

@OperationAuthorization
public ListOfUserGroupsTo getUserGroupsByClientId(Integer clientId) throws GenericException {
    return userGroupRepository.getAllUserGroupsForClient(clientId);
}

Затем у нас есть класс с аннотациями @Aspect и @Component, который перехватывает методы с определенными аннотациями:

@Aspect 
@Component
public class AuthorizationAspect {

@Autowired
AuthorizationService authorizationService;

@Before(value = "@annotation(ch.avelon.alcedo.authorization.annotations.OperationAuthorization)")
public void before(JoinPoint joinPoint) throws Throwable {
    Object[] args = joinPoint.getArgs();
    Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

    authorizationService.checkOperationAuthorization(method, args);
}

В AuthorizationService передается метод со всеми аргументами. Проверьте, авторизован ли клиент для получения групп пользователей. Если это не так: бросьте наше исключение, и метод остановится.

person Ivan Aracki    schedule 04.09.2017
comment
Я столкнулся с той же проблемой - как предоставить доступ к методу rest API только для авторизованных пользователей с помощью AOP - другими словами, как использовать аспекты не только для ведения журнала, но и в целях безопасности. ТАК, если вы создадите исключение в своем аспекте, вы предотвратите доступ, но ваша система не вернет значимый статус http. - person Kirill Ch; 13.06.2018