一尘不染

如何允许用户仅在Spring Boot / Spring Security中访问自己的数据?

spring-boot

我有一些这样的休息API:

/users/{user_id}
/users/{user_id}/orders
/users/{user_id}/orders/{order_id}

我该如何保护它们?每个用户只能看到她/他的数据,但是管理员可以看到所有这些数据。

我必须如何在Spring Security中实现Id == 1的用户看不到Id == 2的用户数据,反之亦然,希望角色admin的用户可以看到全部?

我是否在将会话中的每个方法用户ID与传递给api的user_id参数等同之前进行检查?有没有更好的办法?

ps:我在Spring Security上使用JWT。


阅读 548

收藏
2020-05-30

共1个答案

一尘不染

在任何@Controller@RestController注解豆你可以使用Principal直接作为方法的参数。

    @RequestMapping("/users/{user_id}")
    public String getUserInfo(@PathVariable("user_id") Long userId, Principal principal){
        // test if userId is current principal or principal is an ADMIN
        ....
    }

如果您不想在中进行安全检查,则Controller可以使用 Spring EL
表达式。您可能已经使用了一些内置表达式,例如hasRole([role])

您可以编写自己的表达式。

  1. 创建一个 bean

    public class UserSecurity {
         public boolean hasUserId(Authentication authentication, Long userId) {
            // do your check(s) here
        }
    }
    
  2. 用你的表情

    http
     .authorizeRequests()
     .antMatchers("/user/{userId}/**")
          .access("@userSecurity.hasUserId(authentication,#userId)")
        ...
    

令人高兴的是,您还可以组合以下表达式:

    hasRole('admin') or @userSecurity.hasUserId(authentication,#userId)
2020-05-30