Хорошо, я нашел способ предотвратить AccessDeniedException.Однако это не решает проблему.Исключение остальной части кода теперь выполняется нормально, однако защищенный вызов метода не предотвращается, даже когда hasPermission возвращает false.
Вот как мне удалось предотвратить AccessDeniedException от остановки всего:
Вам необходимо реализовать AccessDecisionManager , где вы предотвращаете распространение AccessDeniedException .Это самая легкая часть.Моя выглядит следующим образом:
public class SkipMethodCallAccessDecisionManager extends AffirmativeBased {
@Override
public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes){
try{
super.decide(authentication, object, configAttributes);
}catch(AccessDeniedException adex){
logger.debug("Access Denied on:" + object);
}
}
}
Тогда сложная часть ... настройка контекста приложения.
<sec:global-method-security pre-post-annotations="enabled" access-decision-manager-ref="skipMethodCallAccessDecisionManager "/>
<bean id="skipMethodCallAccessDecisionManager" class="com.application.auth.vote.SkipMethodCallAccessDecisionManager ">
<property name="decisionVoters">
<list>
<bean class="org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter">
<constructor-arg ref="expressionBasedPreInvocationAdvice"/>
</bean>
<!-- Insert RoleVoter if required -->
<bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>
</list>
</property>
</bean>
<bean id="expressionBasedPreInvocationAdvice" class="org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice">
<property name="expressionHandler" ref="expressionHandler"/>
</bean>
Любые идеи о том, как предотвратить вызов метода, не останавливая все