发布于2021-06-12 12:34 阅读(581) 评论(0) 点赞(7) 收藏(5)
环境需求:redis3.8.2+maven+springBoot+jdk1.8+freemarker模板
周末在家,上家同事突然联系,让我给他网站做单点登入功能,于是自己先梳理逻辑,实现功能并且记录下来。
单点登入(Single sign on)顾名思义,就是在一个网站登入之后,其他网站就不需要用户继续输入账号密码,而能免密登入,这种技术在大型网站都使用的非常频繁,比如阿里巴巴,当用户登入他们系统后,每个子系统都能自动登入,如果大家在登入某宝之后,登入某碑,也需要密码,登入淘宝也需要重新输入密码,这肯定会造成用户体验极差,而且系统的认证逻辑也会很麻烦,这时候单点登入就出现了。
本文演示两个系统
-
- @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过期时间内其他子系统都能免密登入。
https://blog.csdn.net/ke1ying/article/details/117822312?spm=1001.2014.3001.5501
最后,看到这里的读者,如果喜欢的话安排一波(点赞,收藏,关注),原创不易,每周定期分享小知识。
原文链接:https://blog.csdn.net/ke1ying/article/details/117787334
作者:niceboty
链接:http://www.javaheidong.com/blog/article/221876/71627ea6941e3c5be682/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!