当前位置: 首页 > 知识库问答 >
问题:

Spring Security——带有请求主机名的令牌认证

费星晖
2023-03-14

我有一个使用Spring Boot实现的应用程序,我在其中使用Spring Security进行身份验证。我已经有了“基于令牌的”身份验证,其中要求客户端检索令牌,然后在后续请求中使用该令牌进行身份验证。

我希望对此进行增强,以便令牌可以被限制为特定主机名,因此只能用于来自该主机的请求。这类似于谷歌地图API对其API密钥所做的操作,可以通过IP或主机名来限制它们。

以下是我实现的代码,用于尝试检索请求的主机名

public String getClientHostName(HttpServletRequest request) {
    String hostName = null;
    // get the request's IP address
    String clientAddress = httpRequest.getRemoteAddr();
    String xfHeader = httpRequest.getHeader("X-Forwarded-For");
    if (xfHeader != null) {
        clientAddress = xfHeader.split(",")[0];
    }   

    // try to resolve the host name from the IP address
    try {
        InetAddress address = InetAddress.getByName(clientAddress);
        hostName = address.getHostName();
    } catch (UnknownHostException e) {
        logger.error("Failed to get the host name from the request's remote address. ", e);
    }

    return hostName;
}

我现在有两个问题:

>

  • 此代码并不总是设法检索主机名。有时它只是返回IP地址。我知道这可能归结为InetAddress类所做的一些IP欺骗检查。

    当测试来自不同主机的请求时,我并不总是得到我期望的IP地址。我经常得到转发请求的另一台主机的IP地址(我以为通过检查“X-Forwarded-For”就可以解决这个问题)。这让我想知道如何检索真正发出请求的主机的IP地址。

    是否有可靠的方法来检查请求发起者的主机名?

  • 共有1个答案

    公风史
    2023-03-14

    您是否尝试过通过字符串referer=request获取主机名。getHeader(“referer”)

    此外,在客户端,您也可以添加一个代码片段来查找标头中的主机名。

    或者,您可以提供以下代码以添加到客户端和服务器上。您可以读取域的值,该值将返回主机名

    <input type="button" value="Register" onClick="call()"/>
    <script>
    function call(){
        var domain=window.location.hostname;
        window.open('http://<your-hostname>/register?domain='+domain,'_self');
    }
    </script>
    

     类似资料:
    • 问题内容: 将请求正文与GET请求一起传递是否违反REST风格? 例如在Elasticsearch中过滤一些信息 甚至设计了一些工具来避免GET请求中的请求主体(例如邮递员) 问题答案: 从RFC: GET请求消息中的有效负载没有定义的语义。在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。 换句话说,这不是禁止的,但是它是未定义的行为,应避免使用。HTTP客户端,服务器和代理可以随

    • 当我尝试用Angular和Angular实现XSRF时,我一直得到这个消息。NET CORE:“验证提供的反伪造令牌失败。已交换cookie令牌和请求令牌。”我在Angular和API中都配置了相同的cookie和头名称。有人有什么想法吗? 过程 Angular对此API方法进行初始调用以检索cookie Angular然后截取下一个POST请求并稍微覆盖默认的XSRF处理,因为我需要它来处理HT

    • 在测试我的客户机-服务器分布式系统时,我最初惊讶地得知TLS的默认JSSE实现不进行主机名验证。我在这个问题中尝试了公认的答案,但我的用例有点不同。我使用RabbitMQ的连接工厂,它抽象了SSLSocket的构造。我只是为连接工厂提供了一个SSLContext。我确实找到了很多关于HTTPS的信息,甚至还有一些其他协议,但并不是总能使用的通用协议,即使是自定义协议。 但是,除了使用之外,关于创建

    • 我正在尝试向正在运行的本地服务器发出GET请求。我无法返回正确的数据,我看到“未经授权”的响应。如果字符串“token”是正确的,那么任何人都能发现任何明显的问题吗。 }* 我能够从命令行获得一个curl请求:

    • 我试图使用flask_oauthlib访问我的twitter api,但我得到的只是错误:未能生成请求令牌。这是密码。 这在使用http://term.ie/oauth/example/client.php时不起作用,我设法获得了一个请求令牌。 我用https://github.com/lepture/example-oauth1-server/blob/master/client.py和http

    • 我正在尝试连接到FatSecret API。这是他们为oauth2授权提供的留档链接:https://platform.fatsecret.com/api/Default.aspx?screen=rapiauth2#using-token-api 我已经完成了第一步和第二步,现在我被困在第三步。我已经设法用“application/json”更新了标题,但我不确定我的调用是否包括我创建的令牌。我得