我的问候。
我有这样一个问题。spring security 中是否有任何方法可以检查来自同一 IP 地址的登录数量?我的意思是,如果有人从这个当前 IP 登录,我想通知他他无法使用不同的凭据(例如从不同的浏览器)登录并拒绝登录尝试。
我试图用谷歌搜索它并找到以下内容,但这不是我要找的东西:
我的问候。
我有这样一个问题。spring security 中是否有任何方法可以检查来自同一 IP 地址的登录数量?我的意思是,如果有人从这个当前 IP 登录,我想通知他他无法使用不同的凭据(例如从不同的浏览器)登录并拒绝登录尝试。
我试图用谷歌搜索它并找到以下内容,但这不是我要找的东西:
一种可能的解决方案是实现一对自定义AuthenticationSuccessHandler
,LogoutSuccessHandler
并且(都可以访问 http 请求)可以维护一个并发映射,该映射保存由其 ip 地址键入的登录用户数量。然后添加一个自定义过滤器,该过滤器拦截登录请求,检查该映射,并在用户 IP 地址超出限制时重定向用户。
我认为没有办法开箱即用。您实际上可以做的是限制来自一个浏览器实例的最大连接数(请参阅并发会话章节)。
如果这对您来说还不够,那么您可以手动完成(感谢 Spring Security 中精心设计的扩展点)。按照此处的说明定义您的自定义过滤器。为会话注册表声明一个别名并加载所有主体。在正常情况下,每个主体将由 Authentication 对象表示。Authentication.getDetails() 可能包含一个 IP 地址。查找重复项并将用户重定向到某个错误页面。希望这可以帮助。
编辑。它不起作用,因为会话注册表中的主体实际上是 org.springframework.security.core.userdetails.User 的一个实例,而不是身份验证。
SessionAuthenticationStrategy是监视和控制登录尝试的点。已经有ConcurrentSessionControlStrategy用于限制由相同用户名登录的会话。您可以扩展它或从中学习。并重定向或转发到SimpleUrlAuthenticationFailureHandler中的错误页面。
/**
* Strategy which handles concurrent session-control, in addition to the functionality provided by the base class.
*
* When invoked following an authentication, it will check whether the user in question should be allowed to proceed,
* by comparing the number of sessions they already have active with the configured <tt>maximumSessions</tt> value.
* The {@link SessionRegistry} is used as the source of data on authenticated users and session data.
* <p>
* If a user has reached the maximum number of permitted sessions, the behaviour depends on the
* <tt>exceptionIfMaxExceeded</tt> property. The default behaviour is to expired the least recently used session, which
* will be invalidated by the {@link ConcurrentSessionFilter} if accessed again. If <tt>exceptionIfMaxExceeded</tt> is
* set to <tt>true</tt>, however, the user will be prevented from starting a new authenticated session.
* <p>
* This strategy can be injected into both the {@link SessionManagementFilter} and instances of
* {@link AbstractAuthenticationProcessingFilter} (typically {@link UsernamePasswordAuthenticationFilter}).
*
* @author Luke Taylor
* @since 3.0
*/
public class ConcurrentSessionControlStrategy extends SessionFixationProtectionStrategy