0

私の現在のプロジェクトには、メソッドベースのセキュリティによって保護された一連のサービスクラスがあります。

現在、場合によっては、「システム」はそれ自体でセキュリティで保護されたメソッドを呼び出す必要があります。(例:ユーザーがチャネルを離れ、チャネルが空であるため暗黙的に閉じられます。通常は「閉じる」が保護されます)。

セキュリティで保護された方法とセキュリティで保護されていない方法で同時にサービスクラスへのアクセスを提供するにはどうすればよいですか?

編集-短い例

auhentication中に、システムはここにユーザーに対するアクティブな禁止があるかどうかをチェックします。

public User authenticate(String name, String token) throws BadCredentialsException, RuntimeException {
    User user = get(name);
    if (user == null || !user.getToken().equals(token)) {
        throw new BadCredentialsException("Invalid Project/Username/Password");
    }
    Ban userBan = banService.getBanForUser(user);
    if (userBan != null) {
        throw new UserBannedException("User was baned", userBan);
    }
    return user
}

ただし、禁止へのアクセスはメソッドベースのセキュリティによって保護されているため、すべてのユーザーが禁止を「取得」できるわけではありません。

@PreAuthorize("isAuthenticated()")
public Ban getBanForUser(User user) {
    return ...
}

したがって、基本的に、このメソッドにアクセスするには2つの方法が必要です。1つはスプリングセキュリティインターセプターによって保護されており(「ユーザー」の場合)、もう1つは保護されていません(「システム」の場合)。

これはラッパークラス、継承魔法、...なしで可能ですか?

同じクラスの2つの春の豆を定義できれば素晴らしいと思います。1つは春のセキュリティがあり、もう1つはありません。

4

1 に答える 1

1

解決策(もちろん、エレガントなものに近いものはありません)は、保護されたメソッドを呼び出す直前にスーパーユーザーの認証をシミュレートすることです。このようなもの:

SecurityContextHolder.getContext().setAuthentication(privileged user here);    
Ban userBan = banService.getBanForUser(user);
SecurityContextHolder.getContext().setAuthentication(null);
于 2012-05-31T14:59:19.747 に答える