我对春季安全性有疑问。假设我有这样的端点
/orders/order/{userId}
当我有多个登录用户并且有人可以键入另一个登录用户的userId时,如何避免这种情况。例如
用户_1 具有id = 1
,
User_2 具有id = 2
,现在User_2只需输入User_1的ID即可检索其订单或将其删除。我应该只检查每个请求,如果URL中的ID等于当前登录的用户,或者有更好的方法来实现Spring Security?当我在网址格式中使用用户名而不是用户ID(例如
)时,会出现相同的情况 /orders/order/{username}
答案 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变得无用。