繁体   English   中英

Spring 安全性 - 使用请求主机名进行令牌身份验证

[英]Spring Security - Token authentication with request host name

我有一个使用 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;
}

我现在有两个问题:

  1. 此代码并不总是设法检索主机名。 有时它只返回 IP 地址。 我知道这可能是由于一些IP 欺骗检查 InetAddress class 所做的

  2. 在测试来自不同主机的请求时,我并不总是得到我期望的 IP 地址。 我经常得到另一个正在转发请求的主机的 IP(我认为可以通过检查“X-Forwarded-For”来解决)。 这让我想知道如何甚至检索作为请求的真正发起者的主机的 IP。

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

您是否尝试过通过String referrer = 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM