Spring security 和 spring data :安全访问不属于当前用户的数据

Posted

技术标签:

【中文标题】Spring security 和 spring data :安全访问不属于当前用户的数据【英文标题】:Spring security and spring data : secure access to data that doesn't belong to the current user 【发布时间】:2020-10-24 12:38:34 【问题描述】:

我正在使用 mongodb 构建一个 angular/springboot 全栈项目。但是我有一个关于访问不属于当前用户的数据的安全问题。例如,如果我有一个 url /mydata/123 那么当前用户可以在 /mydata/7865 之类的 url 中使用随机 id 并访问不属于他的数据。

这里是一个数据模型示例:

mydatamodel 
    id
    criticaldata

请问如何避免这种用例,以及这样做的最佳做法是什么。 谢谢。

【问题讨论】:

您也可以将您的 URI 更改为 /mydata 并从 SecurityContextHolder 获取登录用户 【参考方案1】:

使用可以通过 SPEL 中的主体访问当前登录的用户,并且您还可以访问 userId,因为它是请求参数。然后你在一个 bean 中运行你的规则。

@PreAuthorize("@userIdAccessCheckService.hasAccessTo(principal , #userId)")

@GetMapping("/user/userId")
public void yourRestControllerMethod(@RequestParam("userId") String userId)
    

  @Service
  public class UserIdAccessCheckService

    
      // In this method, you can run your rule and check 
      // if the logged in person have access to userid
      public boolean hasAccessTo(User principal , String userId)
       ....
      
  

注意

如果您允许控制器方法但希望根据类似规则显示/隐藏该页面上的某些部分,则它有一些缺点。既然这不是问题,那很好

【讨论】:

以上是关于Spring security 和 spring data :安全访问不属于当前用户的数据的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security入门(3-4)Spring Security 异常处理异常传递和异常获取

Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core

Spring Session 和 Spring Security

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

Spring、CORS 和 j_spring_security_logout

Spring Security入门(3-5)Spring Security 的鉴权 - 决策管理器和投票器