在春季使用ID保护端点

时间:2019-09-20 08:37:13

标签: java spring spring-boot spring-security

我对春季安全性有疑问。假设我有这样的端点

 /orders/order/{userId}

当我有多个登录用户并且有人可以键入另一个登录用户的userId时,如何避免这种情况。例如

用户_1 具有id = 1

User_2 具有id = 2

,现在User_2只需输入User_1的ID即可检索其订单或将其删除。我应该只检查每个请求,如果URL中的ID等于当前登录的用户,或者有更好的方法来实现Spring Security?当我在网址格式中使用用户名而不是用户ID(例如

)时,会出现相同的情况
 /orders/order/{username}

2 个答案:

答案 0 :(得分:1)

当用户使用其凭据登录时,我们通常会为其生成唯一令牌并将其发送给客户端。然后,客户端将该令牌发送给其他请求,以在服务器端验证用户。您可以创建并使用Utils类来生成令牌并验证用户。当用户在/orders/order/{userId}发出请求时,获取用户ID并将其与令牌中的用户ID映射。如果有效,则执行所需的操作或给出响应401/403(在此我以JWT令牌为例)

public String getUsernameFromToken(String token) {
     return getClaimFromToken(token, Claims::getSubject);
} 

 public String generateToken(User user) {
     return doGenerateToken(user.getEmail() , user.getRole());
 }

答案 1 :(得分:0)

您有任何形式的身份验证吗? 用户登录后,您可以使用令牌(例如JWT)处理其ID,并将URL中的ID与令牌中编码的ID进行匹配,尽管此时URL中的ID变得无用。