У меня есть следующая ситуация: механизм авторизации моего приложения реализован с использованием Spring безопасности. Центральный класс реализует AccessDecisionManager и использует избирателей (каждый из которых реализует AccessDecisionVoter), чтобы решить, предоставлять ли доступ к определенному методу или нет. Алгоритм, который подсчитывает голоса является обычай:Как выбросить информативное исключение из AccessDecisionManager, который использует избирателей
public class PermissionManagerImpl extends AbstractAccessDecisionManager {
public void decide(
Authentication authentication,
Object object,
ConfigAttributeDefinition config) throws AccessDeniedException {
Iterator<?> iter = getDecisionVoters().iterator();
boolean wasDenied = false;
while (iter.hasNext()) {
AccessDecisionVoter voter = (AccessDecisionVoter) iter.next();
int result = voter.vote(authentication, object, config);
switch (result) {
// Some tallying calculations
}
}
if (wasDenied) {
throw new AccessDeniedException("Access is denied");
}
}
}
После отказывая доступ к каким-либо способом, клиент приложения заинтересован в получении информативное исключение, которое указывает именно почему доступ запрещен. Это подразумевает передачу некоторой информации от избирателей руководителю решения. К сожалению, единственная информация, стандартная AccessDecisionVoter переходит обратно к менеджеру решения является одним из возможных возвращаемых значений (ACCESS_GRANTED, ACCESS_ABSTAIN или ACCESS_DENIED).
Каков наилучший способ сделать это?
Спасибо.