首页 > 数据库 >redis实现用于限制非法登录

redis实现用于限制非法登录

时间:2023-08-25 10:05:41浏览次数:31  
标签:username return String 登录 redis 非法 private jedis

redis实现用于限制非法登录次数为5次,锁定10分钟,并设置登录连接超时时间为10分钟

要使用 Redis 实现限制非法登录次数、锁定和设置登录连接超时时间,可以结合 Redis 的计数器(counter)、设置过期时间(expire)和获取剩余有效时间(ttl)的功能。

下面是一个示例的 Java 代码,使用 Redis 来实现这个功能:

import redis.clients.jedis.Jedis;

public class LoginManager {
    private static final int MAX_LOGIN_ATTEMPTS = 5;       // 最大登录尝试次数
    private static final int LOCKOUT_DURATION = 600;       // 锁定持续时间(10分钟,以秒为单位)
    private static final int LOGIN_TIMEOUT = 600;          // 登录超时时间(10分钟,以秒为单位)

    private Jedis jedis;

    public LoginManager() {
        this.jedis = new Jedis("localhost");
    }

    public boolean isLocked(String username) {
        return jedis.exists(getLockKey(username));
    }

    public boolean isLoginTimedOut(String username) {
        String lastAttemptTime = jedis.get(getLastAttemptTimeKey(username));
        if (lastAttemptTime != null) {
            long elapsedTime = System.currentTimeMillis() / 1000 - Long.parseLong(lastAttemptTime);

            if (elapsedTime >= LOGIN_TIMEOUT) {
                jedis.del(getLastAttemptTimeKey(username));
                return true;
            }
        }
        return false;
    }

    public boolean login(String username, String password) {
        if (isLocked(username) || isLoginTimedOut(username)) {
            return false;
        }

        if (isValidCredentials(username, password)) {
            jedis.del(getLoginAttemptsKey(username));
            jedis.del(getLastAttemptTimeKey(username));
            return true;
        } else {
            long loginAttempts = jedis.incr(getLoginAttemptsKey(username));
            if (loginAttempts >= MAX_LOGIN_ATTEMPTS) {
                jedis.setex(getLockKey(username), LOCKOUT_DURATION, "");
            }
            jedis.set(getLastAttemptTimeKey(username), String.valueOf(System.currentTimeMillis() / 1000));
            return false;
        }
    }

    private boolean isValidCredentials(String username, String password) {
        // 进行用户名和密码验证逻辑
        // 返回 true 表示验证通过,返回 false 表示验证失败
        return false;
    }

    private String getLoginAttemptsKey(String username) {
        return "login:attempts:" + username;
    }

    private String getLastAttemptTimeKey(String username) {
        return "login:last_attempt_time:" + username;
    }

    private String getLockKey(String username) {
        return "login:lock:" + username;
    }
}

请确保已经安装并启动了 Redis 服务器。代码中的示例默认使用本地的 Redis 服务器(localhost)。

在上述代码中,我们使用了 Redis 中的计数器(counter)实现登录尝试次数的限制。每次登录尝试都会调用 login() 方法,首先检查是否已经锁定或超时,然后进行用户名和密码验证。如果验证成功,则删除与该用户相关的登录尝试次数和上次尝试时间的键值对;否则,增加登录尝试次数,并根据达到最大登录尝试次数设置锁定键的过期时间,并记录当前尝试时间。

请注意,示例中的 isValidCredentials() 方法是一个占位方法,需要您根据实际需求来实现正确的用户名和密码验证逻辑。

以下是一个使用示例:

public class Main {
    public static void main(String[] args) {
        LoginManager loginManager = new LoginManager();

        // 模拟登录尝试
        boolean success = loginManager.login("username", "password");

        if (success) {
            System.out.println("登录成功!");
        } else {
            if (loginManager.isLocked("username")) {
                System.out.println("登录已被锁定,请稍后再试。");
            } else if (loginManager.isLoginTimedOut("username")) {
                System.out.println("登录超时,请重新尝试。");
            } else {
                System.out.println("用户名或密码错误,请重试。");
            }
        }
    }
}

在上述示例中,我们创建了一个 LoginManager 实例,并使用 login() 方法模拟了一次登录尝试。然后根据登录结果使用 isLocked()isLoginTimedOut() 方法检查登录状态,并输出相应的提示信息。

标签:username,return,String,登录,redis,非法,private,jedis
From: https://blog.51cto.com/u_16115561/7226299

相关文章

  • Redis:redis启停
    学习自:《Redis开发与运维》PDF47页1、常规用法开启:redis-server redis.conf&完整版:/安装目录/bin/redis-server/安装目录/bin/redis.conf&/usr/local/redis/bin/redis-server/usr/local/redis/redis.conf&关闭:/安装目录/bin/redis-clishutdown  2、启......
  • Docker 安装Redis 无法使用配置文件设置密码问题
    背景最近开发需要使用各种组件,如果都到开发机上安装,会占用电脑资源较多。所以使用docker容器来安装这些组件。例如redis、mongodb、mysql、rabitmq、elasticsearch等等。遇到的问题用edis官方镜像启动容器后,发现没有加载配置文件。解决方案1.redis镜像拉下来......
  • CentOS7.9搭建开发环境(Java、MySQL、Nginx、Redis)
    系统使用的阿里云CentOS7.964位SCC版。先安装个文件上传下载工具lrzsz,xshell登录终端,运行下面的命令:yuminstall-ylszrz 这是因为yum源的问题,需要修改yum配置。执行以下命令:cd/etc/yum.repos.dmvCentOS-Base.repoCentOS-Base.repo.backupwgethttp://mirrors.......
  • 登录和注册功能的实现
    本来使用flask框架制作网页并实现登录和注册在几天前就已经实现了,不过当时没有设计到一些数据库之间的关联,而且使用了的是pymysql并且反复的打开数据库的方式。现在这次使用的是数据库池的方式,然后不同的数据库之间也设定了外键。importpymysqlfromdbutils.pooled_dbimport......
  • Docker下搭建Redis集群
    一、Redis集群方案的简单介绍Redis集群的方案一般分为三种:哈希取余分区一致性哈希算法分区哈希槽分区(本文介绍的就是这种) 1、哈希取余分区:优点:简单粗暴,只要提前预估好数据量,然后规划好节点,例如:3台、30台、300台节点,就能保证未来一段时间内的数据支撑。 缺点:事先规......
  • WinForm微信扫码登录
    源码还需优化,不喜勿喷。微信官方文档: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html前期准备:1.微信开放平台开发者资质认证  https://open.weixin.qq.com/  费用300大概1-2天时间 2.创建网站应用,需要已备案域名、......
  • adocker yml如何操作才能让搭建的redis集群能通过外网访问ip+端口的集群所有信息
    要在Docker中操作以便通过外部网络访问Redis集群的IP和端口,您需要执行以下操作:首先,您需要创建一个DockerComposeYAML文件(docker-compose.yml),用于定义Redis集群的配置。在此文件中,您可以指定每个Redis节点的配置和网络设置。以下是一个示例配置:version:'3'services:redis1:......
  • Redis 缓存满了怎么办?
    引言Redis缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。此时,应该怎么办?本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。 值得注意的是,在Redis中 过期策略和内存淘汰策略是两个完全不同的概念。Redis过期策略指的是Red......
  • Nginx内置lua版OpenResty拦截转发请求Redis等操作
    Nginx内置lua版OpenResty拦截转发请求Redis等操作1下载并安装OpenRestyhttp://openresty.org/cn/download.html2下载lua-resty-http-0.17.1库以让openresty的lua支持外部http访问能力lua-resty-http-0.17.11下载lua-resty-http-0.17.12然后将文件中lua-resty-http......
  • Redis相关
    redis-pipeline机制pipeline是Redis的一个提高吞吐量的机制,适用于多key读写场景,比如同时读取多个key的value,或者更新多个key的value。因为redis本身是基于Request/Response协议的,在正常情况下,客户端发送一个命令,等待Redis返回结果,Redis接收到命令,处理后响应。如果进行多次的读和......