java sso 单点登录 (方式之一 比较简单的方式)

本贴最后更新于 2423 天前,其中的信息可能已经水流花落

关于单点登录(Single Sign On)

概念性的东西,谷歌百度上很多资料,我这里就不详细讲了,[附上百科链接](https://baike.baidu.com/item/SSO/3451380),SSO的实现

网上也能找到一大堆资料。起初我是为了实现系统的保持登录状态,而了解到这个sso,单点登录应该会是很多系统都必须用到的一个模块,

对于每一个程序员来说,这个是必须会的技能。单点登录也有很多层次的实现,我这里就简单讲一下一个基于cookie的在同一个顶级域名下

子系统之间的sso实现原理。

关于 cookie

cookie的定义,功能我在这里不在叙述,也可以在谷歌百度上找到相关资料。在这里我主要想提到cookie的存储,维基百科上提到:按在客

户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短

暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,

按存在时间,可分为非持久Cookie和持久Cookie。

在本文提到的sso实现方式中,cookie是这个实现的桥梁,是唯一的验证token。所以cookie只要拿到手,就等于有了权限,为了防止别人伪造,

这个有权限的cookie是需要加密的。而加密解密都需要在后台完成。

实现步骤

1、 用户登录,完成权限认证后,产生一个唯一的ssokey,String ssokey = des.encrypt(RANDOM.nextInt(999999) + "|" + user_id + "|" + RANDOM.nextInt(999999));

   参数解析:这个user_id 可以是其他,但是最好可以跟你的当前登录用户建立起联系。这个ssokey必须是唯一的。

2、 把ssokey写入cookie,CookieUtil.set(response, domainName, cookieName, ssokey, keepLogin ? ssoCookieMaxage : -1, false);

   参数解析:
  
   domainName:共享cookie的域名,一般用顶级域名,比如我的   .huiyanxian.cn ,那么cookie在此域名底下是共享的。
  
   cookieName:cookie的名字,可以自定义,最好跟cookie的用途相关来命名
   
   ssokey:唯一的token,校验的证书
   
   keepLogin:顾名思义,是否保持登录,是的话,写入cookie存在时间ssoCookieMaxage,如果不保持登录,则写入-1,cookie将在浏览器退出后删除。
   
   false:是否加密,因为我在产生ssokey的时候已经加密过了,所以这里就不加密了 。
   
   cookie每个人的封装习惯不一样,我只是按照我的个人封装来讲解,如果你需要封装,可以按照自己的业务,或者代码习惯来。
   
3、 再一次登录,或者子系统sso登录,首先查看是否有登录的session,如果没有,在看看是否有ssokey 的cookie,如果没有,跳转去sso系统登录。

   登录之后,ssokey的cookie就存在了,携带ssokey请求sso服务器api,sso服务器通过这个cookie过来的ssokey,解密,拿到里面存在的user_id,
   
   然后查询数据库取得登录的用户信息返回给子系统。 贴上子系统获取登录用户信息代码:
   
   public static Object getLoginUser(HttpServletRequest request) {
		User user = null;
		try {
			String ssokey = CookieUtil.get(request, cookieName);
			if (StringUtils.isEmpty(ssokey)) {
				ssokey = (String) request.getAttribute("ssokey");
			}
			user = (User) request.getSession().getAttribute("loginUser");
			if (user != null) {
				return user;
			}
			if (!StringUtils.isEmpty(ssokey)) {
				String url = ssoRemoteUrl + "?ssokey=" + ssokey;
				String result = HttpUtils.get(url, "UTF-8");
				if (!StringUtils.isEmpty(result)) {
					ObjectMapper objectMapper = new ObjectMapper();
					user = objectMapper.readValue(result, User.class);
				}
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return user;
   }


  sso服务端获取登录用户信息代码:
  
	@RequestMapping(value = "/sso/login/getLoginUser")
	public @ResponseBody Object getLoginUser(HttpServletRequest request, HttpServletResponse response, @RequestParam String ssokey) {
		User user = null;
		try {
			if (!StringUtils.isEmpty(ssokey)) {
				int user_id = getUserId(ssokey);
				user = iUserService.selectById(user_id);
				if (user != null) {
					return user;
				}
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return user;
	}

  sso登录完成。

总结

 1、本应该附上一张流程图,无奈画图功底实在有限,就不丢出来了。本人文字表述或者实现方法可能有缺陷,还请大家指出,实现方法不止一种,这只是本人
 
	  在实现后一个小总结,如若有不正确的地方,还望大家指正,共同学习交流,如果有建议,或者想交流的同学,可以加我QQ:892662026,指出建议交流。
	  
	  大家也可以使用第三方的开源sso插件,比如cas,比如kisso等等。

相关参考链接

[承一个人主页](http://www.cnblogs.com/ywlaker/p/6113927.html)
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 285 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone756 1 赞同
  • lousyprogram 1 赞同

    SSO 过于简单了,如果存在跨浏览器、跨平台和跨系统等情况没有顾及到。

  • someone

    这个是 开源的博客源码 不是我的 :joy: :joy:

  • someone

    跨系统 也可以的啦 只要是同一个顶级域名下的都可以。这个只是比较简单的实现方式啦:sob: ,主要还是能力不够

推荐标签 标签

  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 686 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 5 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 71 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 314 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 4 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 125 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 41 关注
  • 倾城之链
    23 引用 • 66 回帖 • 102 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 181 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 5 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 448 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 595 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 610 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 2 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 2 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注