我有以下情况:我的应用程序的授权机制是使用Spring security实现的。中心类实现AccessDecisionManager并使用投票者(每个投票者都实现AccessDecisionVoter)来决定是否授予对某些方法的访问权限。计算选票的算法是自定义的:
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)。
最好的方法是什么?
谢谢。