我有一些这样的休息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。
在任何@Controller,@RestController注解豆你可以使用Principal直接作为方法的参数。
@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])。
Controller
hasRole([role])
您可以编写自己的表达式。
创建一个 bean
bean
public class UserSecurity { public boolean hasUserId(Authentication authentication, Long userId) { // do your check(s) here } }
用你的表情
http .authorizeRequests() .antMatchers("/user/{userId}/**") .access("@userSecurity.hasUserId(authentication,#userId)") ...
令人高兴的是,您还可以组合以下表达式:
hasRole('admin') or @userSecurity.hasUserId(authentication,#userId)