Spring Security - 进一步限制方法

时间:2016-10-25 22:48:52

标签: spring spring-security spring-security-oauth2

我有一个应用程序正在使用Spring Security授权OAuth2令牌。使用@PreAuthorize标记,我可以在允许用户访问方法之前轻松确保用户具有权限:

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

这非常适合限制没有 account.read 权限的用户访问此方法。

唯一的问题是现在拥有此权限的任何用户都可以访问任何帐户。我想限制用户只能访问自己的帐户。我确信这是一种常见的情况。其他应用程序如何处理这个?

1 个答案:

答案 0 :(得分: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");
    }
}

更新。可能的改进之一可能是首先获取用户,从中获取id并执行repository.findByIdAndUserId(accountId,userId)或类似的事情。 (甚至repositoryFindByIdAndUser(accountId,user))