2016-10-25 2 views
0

私は、SpringセキュリティでOAuth2トークンを認証するアプリケーションを持っています。 @PreAuthorizeタグを使用して、私は簡単にはメソッドへのアクセスを許可する前にユーザーが権限を持っていることを確認することができます:スプリングセキュリティ - その他の制限方法

@PreAuthorize("#oauth2.hasScope('account.read')") 
public void getAccount(int accountId); 
{ 
    //return account 
} 

これは、このメソッドにアクセスすることからaccount.read許可なく制限ユーザーで素晴らしい作品。

唯一の問題は現在です。このアクセス許可を持つユーザーは、アカウントにアクセスできます。私は自分のアカウントにのみアクセスするようにユーザーを制限したい。私はこれが一般的なシナリオであると確信しています。他のアプリケーションはどのようにこれに対処していますか?

答えて

2

ここで問題になるのは、アカウントがユーザーに属しているかどうかをシステムがどのように知るかです。 答えはおそらく、ユーザー< - >アカウントの関係をデータベースに保存しているということです。最も簡単な解決策は、右のあなたの方法でチェックを行うには、次のようになります。

@PreAuthorize("#oauth2.hasScope('account.read')") 
public Account getAccount(int accountId) { 
    // get account from db 
    Account account = repository.findById(accountId); 
    // you will need a little helper to get your User from 
    //Spring SecurityContextHolder or whatever there for oauth2 
    User user = securityManager.getCurrentUser(); 
    if (account.belongs(user)) { 
     return account; 
    } else { 
     throw new UnathorizedException("User is not authorized to view account"); 
    } 
} 

UPD。可能性のある改善点の1つは、まずユーザーを取得し、そこからIDを取得し、repository.findByIdAndUserId(accountId、userId)を実行するか、そのようにすることです。 (またはrepositoryFindByIdAndUser(accountId、user))