Я работаю над защитой конечных точек службы REST с помощью Spring Security. Мне в основном нужно проверить, предоставил ли пользователь полномочия, может ли пользователь вызывать функцию с заданными параметрами, и, наконец, я фильтрую вывод, чтобы пользователь не мог видеть то, чего он не должен.
Для этого у меня есть такой набор аннотаций:
@PostFilter("#canViewOwnAssignment.canView(filterObject) or #canViewAllAssignments.canView(filterObject)")
@PreAuthorize("hasAnyAuthority('canViewOwnAssignment', 'canViewAllAssignments') and (#canViewOwnAssignment.canEnter(userId) or #canViewAllAssignments.canEnter(userId))")
... для всех методов. Единственное, что отличается от приведенного выше фрагмента, - это canViewOwnAssignment и параметр (ы) .canEnter ().
Я хотел бы упростить это, чтобы я мог иметь аннотацию sg следующего вида: @MyAnnotation(bean = CanViewAssignment.class, args = {"userId"})
Как я мог это сделать?
Я попытался расширить PrePostAnnotationSecurityMetadataSource.class, поскольку он анализирует аннотации, однако я не могу просто использовать @Primary, чтобы переопределить его, поскольку экземпляр bean-компонента запечен в GlobalMethodSecurityDefinitionParser.class
Если мне это не нужно, я бы предпочел не переписывать половину Spring Security, только чтобы иметь один замещающий метод.
Есть несколько похожих вопросов: stackoverflow.com/questions/18097152/…, stackoverflow.com/questions/45090693/… и stackoverflow.com/questions/33784202/…. Все без ответа. Следовательно, очень вероятно, что выхода нет.
Вы можете попытаться определить реализацию
BeanPostProcessor
, которая позже добавляет соответствующую информацию через отражение в аннотированный метод. Пример того, как что-то может выглядеть, можно увидеть здесь