java - 基于IP地址的授权

标签 java spring-boot spring-mvc authorization spring-rest

我正在开发一个简单的 Spring Boot RESTful API 用于民意调查管理。简而言之,可以创建公共(public)民意调查,其他“用户”可以投票。

现在我必须确保每个客户每次投票只投票一次。因为我想防止使用常见的身份验证机制,例如 HTTP Basic 或 JWT,所以我考虑通过客户端 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 地址的想法只部分正确。

实际上,人们拥有不止一种设备(例如电话、工作时的计算机、家里的计算机)。每台设备都可以连接到不同的网络,每个设备都有唯一的 IP。此外,IP 地址变化也相当频繁。断开家庭调制解调器/路由器的连接几分钟,重新连接时您可能会获得新的 IP 地址。这样就可以更改他的家庭IP并重新投票。此外,许多(如果不是大多数)客户都支持 NAT设备,这意味着它们的 IP 与许多其他用户共享。根据您提出的方案,一旦与您位于同一 NAT 的人投票,其他人就无法投票。 最后,用户可以轻松地使用 VPN、TOR 和各种其他技术,基本上可以根据需要多次投票。

Also how to deal with IP spoofing?

如果使用 TCP,IP 地址欺骗就不是一件小事了。然而,获取与当前 IP 地址不同的实际 IP 地址非常容易(VPN、TOR 等),而且对此您无能为力。

关于java - 基于IP地址的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58375845/

相关文章:

java - 获取对象为空的对象的类型?

java - java多线程中的锁不起作用

groovy - Spring Boot + Groovy + logback.groovy

java - 为子接口(interface)的 JpaRepository 创建 bean 作为 empRepository 时遇到问题

java - 如何在 Controller 建议中模拟服务进行单元测试

java - 你如何从 Java 调用 Scala 对象?

java - 如何获取xml的内部属性值

java - 重复的 Spring Batch 作业实例

spring-boot - 找不到类型为 'org.springframework.web.reactive.function.client.WebClient' 的 Bean

java - 使用 Spring MVC 的 REST web 服务在发布 JSON 时返回 null