前言:
考虑到现在分布式应用都不可或缺的一个重要部分:单点登录,决定花点时间去学下。本来想直接上现成的CAS框架的,初步的了解了一下后,觉得这个太庞大了,而且不好定制,要完全深度用起来也没那么简单(虽然可能上手容易)。于是脑袋一热,决定自己根据CAS协议自己实现一个(虽然不是很喜欢CAS,但CAS协议还是完全的SSO的标准),开始后前后各种被打断,工作啦,加班啦,花时间解决自己的终身大事啦,拖拖拉拉到现在终于初步得已实现。但是现在还仅仅是实现,尚有很多待优化的部分,由于个人工作还是比较忙的,所以就不去完善了。代码我会放到github,有兴趣的完全可以基于它去提交你们的更新,当然,也可以直接留言跟我说需要改进的地方。废话就到这里,下面直接进入主题。
 
 
技术栈:
  • SpringMVC
  • Filter
  • Listener
  • Cookie/Session
  • Redis/Spring Data Redis
  • HttpClient
 
架构&流程:
a:拦截请求
b:跳转到SSO-Server进行登录
c:返回token
d:验证token
e:验证成功,写入cookie
f:返回资源页面
 
 
项目组件介绍:
  • bounter-sso(项目根目录)
  • sso-server(sso服务器,主要负责登录、token验证、刷新token时间、登出)
  • sso-client(sso客户端,主要负责拦截请求,跟sso服务器通信)
  • bounter-app1(虚拟的应用1)
  • bounter-app2(虚拟的应用2)
 
 
项目运行:
  1. 本地配置虚拟主机(找到hosts文件,加入下面部分)
127.0.0.1     www.sso.com
127.0.0.1     www.app1.com
127.0.0.1     www.app2.com
 
  1. 在jetty中分别启动sso-client、bounter-app1、bounter-app2
 
 
主要功能:
  • 单点登录
实现原理几乎完全按照CAS协议,下面是CAS协议的链接:
 
  • Token的集中存储与验证
本来打算将token保存在sso服务器的session中的,结果发现通过HttpClient进行token验证时,HttpClient生成的请求
与浏览器的请求是不同的session,因此,token验证时无法获取原浏览器session中的token。最后只能采用redis来集中保存
token,这样通过HttpClient验证时就能获取到浏览器保存到redis中的token了。顺带也解决了请求过多时服务器session内存消耗太大的问题。
 
  • 单点登出
主要参考以前CAS源码实现,主要原理大概如下:
    1. 每次有新的会话时,在应用app端保存会话id到一个线程安全的容器中
    2. sso服务器把会话对应的app地址保存到该会话对应的token下,在redis中保存结构如下:
其中,url包含了不同应用app的sessionid
        3. 应用发出注销请求时,先注销掉本应用自己的session,然后访问sso服务器,清除该会话在服务器对应的token,然后注销服务器session,最后触发服务器session注销的listener
        4. 在处理注销的listener中通过httpclient通知该token对应的所有的应用app根据sessionid参数进行注销,同时移除app端会话容器中保存的会话id
 
  • token失效时间的刷新
每次建立新的会话时在sso服务器重设redis失效时间,如下:
//刷新key为sso-token的失效时间  
stringRedisTemplate.expire(ssoToken,EXPIRE_TIME,TimeUnit.MINUTES);
后期改进点:
  • 可以把cookie/session改成JWT(Json Web Token)从而实现完全的无状态化和移动端的支持
  • token,jsessionid等的加密与安全
  • 权限控制
 
源码地址:

根据CAS协议写的简单的SSO框架的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  3. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  4. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  5. 手写一个简单到SpirngMVC框架

    spring对于java程序员来说,无疑就是吃饭到筷子.在每次编程工作到时候,我们几乎都离不开它,相信无论过去,还是现在或是未来到一段时间,它仍会扮演着重要到角色.自己对spring有一定的自我见解, ...

  6. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  7. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...

  8. 写一个简单的Web框架

    在.Net中有两种常用的Web开发方式,一种是Asp.Net WebForm,另一种是Asp.Net MVC.我先简单的给大家介绍下这两种开发方式的特点,然后再应用自定义脚本映射,反射,json2te ...

  9. 集成基于CAS协议的单点登陆

    相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...

随机推荐

  1. qlikview 权限管理和sso集成

    简单总结一下 qlikview 权限管理和SSO集成的过程, 在集成qlikview报表过程中碰到了很多坑, 甚至官方文档也不准确.  如果你也有类似的需求, 可以参考一下本文.  需要说明的是, 本 ...

  2. 使用js代码将HTML Table导出为Excel

    使用js代码将HTML Table导出为Excel的方法: 直接上源码 <html> <head> <meta http-equiv="Content-Type ...

  3. 基于Android 的蓝牙A2DP 功能的实现

    摘 要:蓝牙(Bluetooth)技术是一种低成本的无线数据与数字通信的开放性全球规范. Android 是Google 于2007 年11 月5 日宣布的基于Linux平台开源手机操作系统名称,该平 ...

  4. [C++]PAT乙级1001.害死人不偿命的(3n+1)猜想(15/15)

    /* 1001.害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下 ...

  5. python前后端加密方式

    后端加密方法: python后端加密方式: # 双重工加密 #bytes((7788).encode('utf-8')):为后端加密二把手,多加的锁,该参数可为空,必须加bytes才能实现 md5pa ...

  6. Socket与TCP,UDP

    什么是socket 简单来说是IP地址与端口的结合协议(RFC 793) 一种地址与端口的结合描述协议 TCP/IP协议的 相关API的总称:是网络api的集合实现 涵盖了:Stream Socket ...

  7. t-sql对被除数为0&除数小于被除数结果为0&除法保留2位小数的处理

    SELECT round(CAST(12 AS FLOAT)/nullif(13,0),2,1) FROM TB

  8. 多项式乘法(FFT)学习笔记

    ------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法  ...

  9. 第一章 Android系统的编译和移植实例

    第一章 Android系统的编译和移植实例 这一章节主要介绍了Android系统的编译和移植技术,作为建立在Linux内核的基础上的Android操作系统,它的编译和移植不论在过程还是技术方面都和嵌入 ...

  10. P1880 [NOI1995]石子合并(区间DP)

    题目链接:https://www.luogu.org/problemnew/show/P1880 题目大意:中文题目 具体思路:和上一篇的思路是差不多的,也是对于每一个小的区间进行处理,然后再归并到大 ...