Прежде всего, настройка use-expressions
в элементе <http>
не влияет на аннотации безопасности метода. Они включаются с помощью global-method-security
.
Использование
<security:global-method-security pre-post-annotations="enabled" />
включит PreAuthorize
и связанные с ним аннотации. Причина, по которой защищенная аннотация не работает при включении, заключается в том, что нет избирателя, который знает, что означает CUSTOM_ACCESS
. В настройках по умолчанию RoleVoter
Spring Security использует только те атрибуты, которые начинаются с префикса ROLE_
. См. этот FAQ для получения дополнительной информации.
Избиратели могут использоваться не для проверки простых ролей, а для других целей, поэтому им обычно требуется какой-то способ определить, какие из атрибутов, настроенных для метода, применяются к ним. Аннотации на основе выражений работают не так, как обычные избиратели. Выражение hasRole
просто ищет именованный орган, который назначен пользователю.
Таким образом, если вы создали AccessDecisionManager
для обеспечения безопасности метода с AccessDecisionVoter
, который использует ваш атрибут CUSTOM_ACCESS
, тогда аннотация @Secured
будет иметь эффект. Однако, поскольку он уже работает с PostAuthorize
, вы можете просто придерживаться этого.