gpt4 book ai didi

spring - 如何在 Spring Security 中找到用户的 IP?

转载 作者:IT老高 更新时间:2023-10-28 13:48:04 32 4
gpt4 key购买 nike

我需要找到那些登录我们应用程序的用户。
我们正在使用 Spring Security,必须有办法找出用户的 IP。

我认为这些信息都存储在他们的 session 中。在 Spring Security 中,当前 session 存储在 SessionRegistry .从这个类中,我可以获得经过身份验证的用户列表和一些 session 信息。 (使用 getAllPrincipalsgetAllSessionsgetSessionInformation)

问题是,我怎样才能访问当前用户的 IP?考虑到我们必须只为已知区域提供服务。
SessionInformation没有太大帮助,因为它不包含太多信息。

最佳答案

我认为使用 hasIpAddress 可以实现检查http表达式

参见 15.2 Web Security Expressions 部分

<http use-expressions="true">
<intercept-url pattern="/admin*"
access="hasRole('admin') and hasIpAddress('192.168.1.0/24')"/>
...
</http>

如果你想要更多的灵 active ,你可以实现自己的IP地址检查服务,基于IpAddressMatcher:

<bean id="ipCheckService" class="my.IpCheckService">
</bean>

<security:http auto-config="false" access-denied-page="/accessDenied.jsp"
use-expressions="true">
<security:intercept-url pattern="/login.jsp"
access="@ipCheckService.isValid(request)" />

bean 实现:

public class IpCheckService {
public boolean isValid(HttpServletRequest request) {
//This service is a bean so you can inject other dependencies,
//for example load the white list of IPs from the database
IpAddressMatcher matcher = new IpAddressMatcher("192.168.1.0/24");

try {
return matcher.matches(request);
} catch (UnsupportedOperationException e) {
return false;
}
}
}

更新:您可以尝试通过这种方式获取当前用户IP:

    public static String getRequestRemoteAddr(){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes())
.getRequest();
return request.getRemoteAddr();
}

更新 关于IP地址和 session 之间关系的信息只能从不同的来源收集(如监听AuthenticationSuccessEvent和SessionDestroyedEvent事件,实现过滤器或使用AOP拦截器)。 Spring Security 不存储此类信息,因为它无用,因为 IP 地址仅在服务器处理 ServletRequest 时才有意义。 .

IP 地址可能会更改(用户可能正在使用代理),因此我们只能审核不同类型的事件,例如使用某些凭据登录、从不同 IP 访问服务或进行一些可疑事件。

关于spring - 如何在 Spring Security 中找到用户的 IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11920395/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com