2016-10-25 4 views
0

스프링 보안을 사용하여 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. 가능한 개선 사항 중 하나는 사용자를 먼저 얻고 ID를 가져 와서 repository.findByIdAndUserId (accountId, userId) 또는 그와 같은 것을 수행하는 것입니다. (또는 심지어 repositoryFindByIdAndUser (accountId, user))