Redis实现Single单点登入--系统框架搭建(一)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis实现Single单点登入--系统框架搭建(一)

环境需求:redis3.8.2+maven+springBoot+jdk1.8+freemarker模板


1、需求背景


周末在家,上家同事突然联系,让我给他网站做单点登入功能,于是自己先梳理逻辑,实现功能并且记录下来。


单点登入(Single sign on)顾名思义,就是在一个网站登入之后,其他网站就不需要用户继续输入账号密码,而能免密登入,这种技术在大型网站都使用的非常频繁,比如阿里巴巴,当用户登入他们系统后,每个子系统都能自动登入,如果大家在登入某宝之后,登入某碑,也需要密码,登入淘宝也需要重新输入密码,这肯定会造成用户体验极差,而且系统的认证逻辑也会很麻烦,这时候单点登入就出现了。

 

2、代码实例


        本文演示两个系统

image.png

image.png

image.png

@Slf4j
@RestController
@RequestMapping("/redis/single")
public class RedisSingleController {
    private static final String NAME = "name";
    private static final String PASSWORD = "password";
    @Resource
    private RedisTemplate redisTemplate;
    @GetMapping("/login_page")
    public ModelAndView loginPage(){
        ModelAndView mv  = new ModelAndView();
        mv.setViewName("loginPage");
        return mv;
    }
    /**
     * 系统1
     * @return
     */
    @GetMapping("/system1")
    public ModelAndView system1(HttpServletRequest request){
        ModelAndView mv  = new ModelAndView();
        if(redisTemplate.hasKey("name")){
            mv.setViewName("systemOnePage");
            return mv;
        }
        request.getSession().setAttribute("goUrl","indexSystem1");
        mv.setViewName("loginPage");
        return mv;
    }
    /**
     * 系统2
     * @return
     */
    @GetMapping("/system2")
    public ModelAndView system2(HttpServletRequest request){
        ModelAndView mv  = new ModelAndView();
        if(redisTemplate.hasKey("name")){
            mv.setViewName("systemTwoPage");
            return mv;
        }
        request.getSession().setAttribute("goUrl","indexSystem2");
        mv.setViewName("loginPage");
        return mv;
    }
    /**
     * 效验账号密码是否正常
     * @param name
     * @param password
     * @return
     */
    @PostMapping("/detection")
    @ResponseBody
    public Map<String, Object> index( String name, String password, String gotoUrl){
        Map<String, Object> map = new HashMap<>();
        if(!ObjectUtil.equals(name,NAME) || !ObjectUtil.equals(password,PASSWORD)){
            map.put("flag",false);
            map.put("data","账号密码不匹配!");
            return map;
        }
        map.put("flag",true);
        map.put("data","账号密码正确!");
        //redis缓存20s失效
        redisTemplate.opsForValue().set("name",name,10, TimeUnit.SECONDS);
        return map;
    }
    /**
     * 登入成功,系统一进入首页
     * @return
     */
    @GetMapping("/indexSystem1")
    @ResponseBody
    public ModelAndView index(){
        ModelAndView mv  = new ModelAndView();
        mv.setViewName("systemOnePage");
        return mv;
    }
    /**
     * 登入成功,系统二进入首页
     * @return
     */
    @GetMapping("/indexSystem2")
    @ResponseBody
    public ModelAndView indexSystem2(){
        ModelAndView mv  = new ModelAndView();
        mv.setViewName("systemTwoPage");
        return mv;
    }


1、保证访问系统一登入页面时,进入的是系统一首页,访问系统二登入页面时,进入的是系统二首页。


2、在访问系统一或者系统二时,都需要判断redis里是否存在当前用户,存在则免密登入。


3、逻辑处理,在登入先判断数据库里的账号密码是否正确,若用户在页面登入正确,则返回登入成功,并且存入redis,给他设置过期时间。


4、保证在redis过期时间内其他子系统都能免密登入。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
存储 缓存 NoSQL
深入解析Redis:一种快速、高效的键值存储系统
**Redis** 是一款高性能的键值存储系统,以其内存数据、高效数据结构、持久化机制和丰富的功能在现代应用中占有一席之地。支持字符串、哈希、列表、集合和有序集合等多种数据结构,适用于缓存、计数、分布式锁和消息队列等场景。安装Redis涉及下载、编译和配置`redis.conf`。基本操作包括键值对的设置与获取,以及哈希、列表、集合和有序集合的操作。高级特性涵盖发布/订阅、事务处理和Lua脚本。优化策略包括选择合适数据结构、配置缓存和使用Pipeline。注意安全、监控和备份策略,以确保系统稳定和数据安全。
382 1
|
5月前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
428 0
|
5月前
|
NoSQL Linux Redis
Linux系统中安装redis+redis后台启动+常见相关配置
Linux系统中安装redis+redis后台启动+常见相关配置
|
2月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
2月前
|
存储 NoSQL Java
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
该博客文章展示了如何在Linux虚拟机上使用Redis和Jedis客户端实现手机验证码的验证功能,包括验证码的生成、存储、验证以及限制每天发送次数的逻辑,并提供了测试结果截图。
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
|
2月前
|
NoSQL 数据可视化 Linux
一文教会你如何在Linux系统中使用Docker安装Redis 、以及如何使用可视化工具连接【详细过程+图解】
这篇文章详细介绍了如何在Linux系统中使用Docker安装Redis,并提供了使用可视化工具连接Redis的步骤。内容包括安装Redis镜像、创建外部配置文件、映射文件和端口、启动和测试Redis实例、配置数据持久化存储,以及使用可视化工具连接和操作Redis数据库的过程。
|
3月前
|
NoSQL Redis 数据安全/隐私保护
macos系统中redis如何设置密码
以上步骤应该可以帮助你在macOS系统的Redis服务中设置密码,确保你的数据存储更加安全。此外,确保你定期检查Redis安全性相关的最佳实践和更新,以保持你的服务安全可靠。
228 3
|
4月前
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
64 3
|
5月前
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现代Web应用中,性能优化是提升用户体验和响应速度的关键。Redis作为一款开源的内存数据结构存储系统,因其出色的性能、丰富的数据结构和灵活的使用方式,成为了构建高性能缓存系统的首选工具。本文将探讨Redis在缓存系统中的应用,分析其优势,并通过实例展示如何结合Redis构建高效、可靠的缓存系统,以应对高并发、大数据量等挑战。
下一篇
无影云桌面