In the supports(Class clazz) method of RoleVoter, it always returns true saying that
This implementation supports any type of class, because it does not
query the presented secure object.
What is this “presented secure object“. On the other hand, the supports(Class clazz) method of WebExpressionVoter returns true only if clazz is a subtype of FilterInvocation. Is FilterInvocation the “presented secure object” here and why does the voter has to support it ?
If I use @Secured annotations over my methods and configure an access decision manager for global method security that has WebExpressionVoter as one of the voters, it presents an error
AccessDecisionManager does not support secure object class: interface
org.aopalliance.intercept.MethodInvocation
This is because all voters of an access decision manager (when configured for method security) must support the above class, and while RoleVoter and others do, WebExpressionVoter needs a subtype of FilterInvocation.
SPEL expressions in @PreAuthorize tag would also need WebExpressionVoter, and again it would be required to support MethodInvocation class, which it doesn’t. But it does work. So what am I getting wrong here ?
The
secured objectis an abstract representing whatever is secured. It may be aMethodInvocationin case of@Secured,@RolesAllowed,@PreFilterand@PreAuthorize, or aFilterInvocationin case of<intercept-url />or any other object if required.The
@PreFilterand@PreAuthorizeannotations are handled byPreInvocationAuthorizationAdviceVoter. It uses theMethodInvocationto get the annotations and their attributes values, so it has:The
WebExpressionVoteris web-invocation specific, because it matches the URL to the patterns from<intercept-url />, that’s why it has:The
RoleVoteronly uses theAuthenticationobject contents, so it does not depend on thesecured object, and that’s why it has:Note, that You can have a separate
AccessDecisionManagerfor URL level security and method level security. The first will use voters that supportFilterInvocation, and the other the ones that supportMethodInvocation. Also note thatRoleVotersupports both so it can be used in both contexts.