[英]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;
}
我现在有两个问题:
此代码并不总是设法检索主机名。 有时它只返回 IP 地址。 我知道这可能是由于一些IP 欺骗检查 InetAddress class 所做的。
在测试来自不同主机的请求时,我并不总是得到我期望的 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.