基于IP地址的授权

IP address based authorization

我正在开发用于轮询管理的简单 Spring 启动 RESTful API。简而言之,可以创建 public 个民意调查,其他 "users" 个可以投票。

现在我必须确保每个客户每次投票只投票一次。因为我想避免使用 HTTP BasicJWT 等常见的身份验证机制,所以我考虑通过客户端 IP 地址进行授权。意味着我在数据库中存储如下实体:

public class Vote {

    private Long pollId;
    private Long choiceId;
    private String ipAddress;

    ...
}

使用类似这样的方法,我避免了身份验证和帐户管理的需要。

这是正确的方法还是有更好的方法来确保每个客户只投票一次?另外如何应对IP欺骗?希望大家推荐。

Is this the right approach or are there better ones to ensure each client votes just once?

不是真的。每台计算机都有唯一 IP 地址的想法只部分正确。

实际上,人们拥有不止一台设备(例如 phone、工作电脑、家里的电脑)。每个设备都可以连接到不同的网络,每个设备都有一个唯一的 IP。此外,IP 地址更改非常频繁。断开您家 modem/router 的连接几分钟,当它重新连接时您可能会获得一个新的 IP 地址。因此可以更改他的家庭 IP 并再次投票。此外,许多(如果不是大多数)客户端都在 NAT 设备后面,这意味着他们的 IP 与许多其他用户共享。根据您提出的方案,一旦有人在与您相同的 NAT 后面投票,其他人就无法投票。 最后,用户可以轻松地使用 VPN、TOR 和各种其他技术基本上可以根据需要多次投票。

Also how to deal with IP spoofing?

如果使用 TCP,IP 地址欺骗并非易事。然而,获得一个不同于您当前 IP 地址的实际 IP 地址(VPN、TOR 等)非常容易,您对此无能为力。