Redis是一个开源的内存数据结构存储系统,具有高性能、稳定可靠等特点,非常适合用作单点登录系统的存储引擎。本文将介绍如何使用Redis实现一个安全可靠的单点登录系统。
1.登录流程
单点登录系统的流程如下:
1)用户在客户端输入用户名和密码,提交给认证中心。
2)认证中心验证用户名和密码的合法性,如果验证通过,生成一个全局唯一的token,并将token和用户的登录信息存储在Redis中。
3)认证中心把token返回给客户端,客户端将token存储在本地。
4)用户使用token来访问其他应用系统,其他应用系统需要向认证中心验证token的有效性,并获取用户的登录信息。
2.实现细节
下面主要介绍单点登录系统的实现细节。
1)存储用户信息

在Redis中可以使用Hash类型存储用户信息。使用用户名作为Key,用户信息作为Value存储在Hash中。示例代码如下:
// 存储用户信息redisClient.hset("user:username", "username", "password");// 获取用户信息redisClient.hget("user:username", "username");
2)生成token
生成token可以通过Redis的自增功能来实现。使用一个全局计数器作为Key,每次自增后作为token返回。示例代码如下:
// 生成tokenredisClient.incr("token:count");long token = redisClient.get("token:count");
3)存储token
存储token可以使用Redis的String类型。使用token作为Key,存储用户信息的Hash作为Value。并设置过期时间,保证token的安全性。示例代码如下:
// 存储tokenredisClient.setex(token, 3600, "user:username");// 获取token对应的用户信息redisClient.get(token);
4)验证token
验证token需要查询Redis中是否存在该token,并获取用户信息进行验证。示例代码如下:
// 验证tokenString user_info = redisClient.get(token);if (user_info != null) {// 验证通过,返回用户信息return user_info;} else {// 验证失败return null;}
3.安全性考虑
单点登录系统需要保证数据的安全性。下面列举一些安全性考虑。
1)加密存储用户密码
用户密码需要进行加密存储,防止敏感数据泄露。可以使用加密算法如SHA256进行加密,存储加密后的hash值即可。示例代码如下:
// 加密用户密码String password = "123456";MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");byte[] encodedhash = messageDigest.digest(password.getBytes(StandardCharsets.UTF_8));String hashedPassword = bytesToHex(encodedhash);// 存储用户信息redisClient.hset("user:username", "username", hashedPassword);
2)设置token过期时间
设置token的过期时间可以保证token的安全性。如果token过期,则需要重新登录获取新的token。可以使用Redis的`setex`命令设置过期时间。示例代码如下:
// 存储token,设置过期时间1小时redisClient.setex(token, 3600, "user:username");
3)限制错误尝试次数
为防止恶意攻击,需要限制用户在一定时间内输入错误密码的次数。可以使用Redis的计数器功能实现。示例代码如下:
// 设置错误登录次数String ip = request.getRemoteAddr();String key = "error_login:" + ip;long count = redisClient.incr(key);if (count > 3) {// 超过3次,禁止登录1小时redisClient.expire(key, 3600);}
4)防止重放攻击
为防止重放攻击,可以使用时间戳和随机数来生成token,并在token的Value中增加时间戳信息。可以在客户端和 服务器 端分别记录最近一次的token生成时间,如果当前时间戳和上一次生成的时间戳相同,则说明是重放攻击,需要拒绝该请求。示例代码如下:
// 生成token,并在Value中增加时间戳信息long timestamp = System.currentTimeMillis();String random = UUID.randomUUID().toString();String token = timestamp + "-" + random;redisClient.setex(token, 3600, "user:username:" + timestamp);// 防止重放攻击if (lastTokenTime >= timestamp) {// 拒绝该请求}lastTokenTime = timestamp;
4.总结
本文介绍了如何使用Redis实现一个安全可靠的单点登录系统。包括登录流程、实现细节、安全性考虑等方面。Redis提供了方便的API和高性能的存储能力,可以轻松实现一个功能强大的单点登录系统。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
什么是redis呢,求通俗解释
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 从2010年3月15日起,Redis的开发工作由VMware主持。 redis是一个key-value存储系统。 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 在此基础上,redis支持各种不同方式的排序。 与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。 [1]Redis支持主从同步。 数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。 这使得Redis可执行单层树复制。 从盘可以有意无意的对数据进行写操作。 由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。 同步对读取操作的可扩展性和数据冗余很有帮助。
scrapy使用redis的时候,redis需要进行一些设置吗
1.使用两台机器,一台是win10,一台是centos7,分别在两台机器上部署scrapy来进行分布式抓取一个网站7的ip地址为192.168.1.112,用来作为redis的master端,win10的机器作为的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis5.重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的!
PHP开发工程师岗位工作经历怎么写
自我评价(案例一)· 拥有良好的代码习惯,结构清晰,命名规范,逻辑性强,代码冗余率低,注重用户体验开发;· 有很强的事业心和进取精神,热爱开发工作,能承受较大的工作压力;· 具备很好的学习钻研能力,思路清晰,优秀的分析问题和解决问题的能力;· 严谨细致,有责任心,诚实守信,有良好的团队合作能力,工作责任心强。 自我评价(案例二)1.熟练掌握oop的编程思想和mvc的开发模式;2.熟练HTML/CSS/JavaScript,熟练使用ajax,jquery等技术;3.熟练ThinkPHP,Ci,Yii,Laravel等开源框架;4.熟练各种业务项目开发流程及模式;5.熟悉ECShop,Iwebshop,discuz的二次开发;6.熟悉svn,git等版本控制工具的安装配置以及使用;7.熟练使用 memcache ,redis,mongoDB等缓存技术;8.熟悉对象存储(oss)的上传下载;9.熟练单点登录和第三方登录技术;10.熟练各种接口的开发使用,如支付宝支付、短信接口、网络地图等;11.熟练app接口的开发,有独立编写接口的能力;12.熟悉微信公众号的开发;13.熟悉网站静态化:页面静态化和伪静态;14.熟悉常用的数据库优化技巧:索引,缓存,分区分表,SQL优化等;15.熟悉服务器架构设计:主从复制,读写分离,动静分离,负载均衡等;16. 具有较强的团队意识,高度的责任感,工作积极严谨,勇于承担压力自我评价(案例三)从小生活在农村家庭,比较能吃苦耐劳,对编程感兴趣,有新的知识或技术出现的时候,会及时学习。 之前工作主要是与客户,物流,业务员以及厂内生产工作的沟通,沟通和协调能力很强。 平时喜欢打打篮球,喜欢团队合作的娱乐项目。 自我评价(案例四)在工作中,自学能力强,能够很容易的解决技术上遇到的问题,当技术上遇到一些新的技术,通过上网或是利用手头资料,技术上的问题都能迎刃而解,对新的技术有很强的求知欲和自主学习能力。 生活上,有责任心,团队的任务一定按时完成,心胸豁达,可以和周围的人融洽的相处。
发表评论