2016-10-25 3 views
0

У меня есть приложение, которое разрешает токен OAuth2 с Spring Security. Использование тега @PreAuthorize, я могу легко убедиться, что пользователь имеет разрешения, прежде чем разрешить им доступ к методу:Spring Security - Дополнительные методы ограничения

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

Это прекрасно работает на ограничивающих пользователях без account.read разрешения доступа к этому методе ,

Единственная проблема сейчас любой пользователь с этим разрешением может получить доступ к любой счет. Я хочу ограничить пользователей только доступом к их собственной учетной записи. Я уверен, что это общий сценарий. Как другие приложения справляются с этим?

ответ

2

Итак, вопрос здесь - как система узнает, принадлежит ли учетная запись пользователю? Ответ будет заключаться в том, что вы, вероятно, храните User < -> учетную запись в базе данных. Самое простое решение было бы сделать чек прямо в методе:

@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. одним из возможных улучшений может быть, чтобы сначала получить пользователя, получить идентификатор от него и сделать репозиторий.findByIdAndUserId (accountId, userId) или что-то подобное. (или даже репозиторийFindByIdAndUser (accountId, пользователь))

Смежные вопросы