Ok Ich habe einen Weg gefunden, die AccessDeniedException zu verhindern. Dies löst jedoch nicht das Problem. Die Ausführung des restlichen Codes wird nun standardmäßig fortgesetzt, der gesicherte Methodenaufruf wird jedoch nicht verhindert, selbst wenn hasPermission den Wert false zurückgibt.
Dies ist, wie ich die AccessDeniedException von stoping alles zu verhindern, verwaltet:
Sie benötigen einen AccessDecisionManager zu implementieren, wo Sie die AccessDeniedException Ausbreitung zu verhindern. Das ist der einfache Teil. Meine sieht so aus:
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);
}
}
}
Dann der schwierige Teil ... Einrichten des Anwendungskontext.
<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>
Irgendwelche Ideen, um zu verhindern, dass die Methode aufgerufen wird, ohne alles zu stoppen?
Ich endete etwas viel einfacher zu tun, ich habe nur einen Hinweis über den MethodSecurityInterceptor hinzugefügt, der die Ausnahme mit einem @Around abfängt, so dass die Ausbreitung über diesen Punkt hinaus verhindert wird . Auf diese Weise konnte ich vermeiden, Spring Security zu Fuß zu konfigurieren, was sehr kompliziert ist. Was Sie jedoch vorschlagen, ist der kanonische Weg, es zu tun und es funktioniert. – Chepech
Sehr schön! Ich frage mich, ob wir das Verhalten von beforeInvocation() (mit AOP) ändern können, um Benutzerberechtigungen für bestimmte Methoden (die OP schützen möchte) zu überprüfen und mi durch eine Dummy MethodInvocation-Instanz zu ersetzen, anstatt sich um AccessDeniedException zu kümmern. – Ritesh
@Chepech @Around Lösung scheint sehr einfach und elegant. Wenn Sie den betreffenden @Around-Code aktualisieren, werde ich ihn gerne abstimmen. – Ritesh