我有一些这样的rest 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参数相等之前进行检查?有没有更好的方法?
附言:我使用spring security的JWT。
发布于 2018-08-07 15:38:46
您还可以在服务接口上使用@PreAuthorize。如果你有一个自定义的userdetails对象,那么你可以很容易的做到。在我的一个项目中,我是这样做的:
@PreAuthorize(value = "hasAuthority('ADMIN')"
+ "or authentication.principal.equals(#post.member) ")
void deletePost(Post post);
顺便说一下,这是在一个服务接口中。您必须确保添加正确的注释才能获得预授权才能工作。
发布于 2018-08-07 16:06:31
你应该首先选择你的安全策略,你需要什么名字“行过滤”,3A(认证,授权,审计)概念中的授权概念之一。
如果您想实施全面的解决方案,请查看以下内容:
https://docs.spring.io/spring-security/site/docs/3.0.x/reference/domain-acls.html
Spring ACL完全涵盖了“行过滤”、“白黑名单”、“基于角色的授权”、"ACL继承“、”角色投票者“等概念。
否则,您应该保存每个您希望保护的业务案例的所有者,并在您的服务层中对其进行过滤。
发布于 2021-05-25 03:03:50
我们可以创建一个像@IsUser
这样的注释,并将其与控制器方法一起使用。
示例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize(value = "hasRole('ROLE_USER')" + "and authentication.principal.equals(#userId) ")
public @interface IsUser { }
https://stackoverflow.com/questions/51712724
复制相似问题