次のような状況があります: 私のアプリケーションの承認メカニズムは、Spring セキュリティを使用して実装されています。中央クラスは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 ) の 1 つです。
それを行う最良の方法は何ですか?
ありがとう。