sso-client

  1. 拦截子系统未登录用户请求,跳转至sso认证中心
  2. 接收并存储sso认证中心发送的令牌
  3. 与sso-server通信,校验令牌的有效性
  4. 建立局部会话
  5. 拦截用户注销请求,向sso认证中心发送注销请求
  6. 接收sso认证中心发出的注销请求,销毁局部会话

sso-server

  1. 验证用户的登录信息
  2. 创建全局会话
  3. 创建授权令牌
  4. 与sso-client通信发送令牌
  5. 校验sso-client令牌有效性
  6. 系统注册
  7. 接收sso-client注销请求,注销所有会话

  接下来,我们按照原理来一步步实现sso吧!

1、sso-client拦截未登录请求

  java拦截请求的方式有servlet、filter、listener三种方式,我们采用filter。在sso-client中新建LoginFilter.java类并实现Filter接口,在doFilter()方法中加入对未登录用户的拦截

1

2

3

4

5

6

7

8

9

10

11

12

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;

    HttpServletResponse res = (HttpServletResponse) response;

    HttpSession session = req.getSession();

    

    if (session.getAttribute("isLogin")) {

        chain.doFilter(request, response);

        return;

    }

    //跳转至sso认证中心

    res.sendRedirect("sso-server-url-with-system-url");

}

2、sso-server拦截未登录请求

  拦截从sso-client跳转至sso认证中心的未登录请求,跳转至登录页面,这个过程与sso-client完全一样

3、sso-server验证用户登录信息

  用户在登录页面输入用户名密码,请求登录,sso认证中心校验用户信息,校验成功,将会话状态标记为“已登录”

1

2

3

4

5

6

@RequestMapping("/login")

public String login(String username, String password, HttpServletRequest req) {

    this.checkLoginInfo(username, password);

    req.getSession().setAttribute("isLogin"true);

    return "success";

}

4、sso-server创建授权令牌

  授权令牌是一串随机字符,以什么样的方式生成都没有关系,只要不重复、不易伪造即可,下面是一个例子

1

String token = UUID.randomUUID().toString();

5、sso-client取得令牌并校验

  sso认证中心登录后,跳转回子系统并附上令牌,子系统(sso-client)取得令牌,然后去sso认证中心校验,在LoginFilter.java的doFilter()中添加几行

1

2

3

4

5

6

7

8

9

10

11

// 请求附带token参数

String token = req.getParameter("token");

if (token != null) {

    // 去sso认证中心校验token

    boolean verifyResult = this.verify("sso-server-verify-url", token);

    if (!verifyResult) {

        res.sendRedirect("sso-server-url");

        return;

    }

    chain.doFilter(request, response);

}

  verify()方法使用httpClient实现,这里仅简略介绍,httpClient详细使用方法请参考官方文档

1

2

HttpPost httpPost = new HttpPost("sso-server-verify-url-with-token");

HttpResponse httpResponse = httpClient.execute(httpPost);

6、sso-server接收并处理校验令牌请求

  用户在sso认证中心登录成功后,sso-server创建授权令牌并存储该令牌,所以,sso-server对令牌的校验就是去查找这个令牌是否存在以及是否过期,令牌校验成功后sso-server将发送校验请求的系统注册到sso认证中心(就是存储起来的意思)

  令牌与注册系统地址通常存储在key-value数据库(如redis)中,redis可以为key设置有效时间也就是令牌的有效期。redis运行在内存中,速度非常快,正好sso-server不需要持久化任何数据。

  令牌与注册系统地址可以用下图描述的结构存储在redis中,可能你会问,为什么要存储这些系统的地址?如果不存储,注销的时候就麻烦了,用户向sso认证中心提交注销请求,sso认证中心注销全局会话,但不知道哪些系统用此全局会话建立了自己的局部会话,也不知道要向哪些子系统发送注销请求注销局部会话

7、sso-client校验令牌成功创建局部会话

  令牌校验成功后,sso-client将当前局部会话标记为“已登录”,修改LoginFilter.java,添加几行

1

2

3

if (verifyResult) {

    session.setAttribute("isLogin"true);

}

  sso-client还需将当前会话id与令牌绑定,表示这个会话的登录状态与令牌相关,此关系可以用java的hashmap保存,保存的数据用来处理sso认证中心发来的注销请求

8、注销过程

  用户向子系统发送带有“logout”参数的请求(注销请求),sso-client拦截器拦截该请求,向sso认证中心发起注销请求

1

2

3

4

String logout = req.getParameter("logout");

if (logout != null) {

    this.ssoServer.logout(token);

}

  sso认证中心也用同样的方式识别出sso-client的请求是注销请求(带有“logout”参数),sso认证中心注销全局会话

1

2

3

4

5

6

7

8

@RequestMapping("/logout")

public String logout(HttpServletRequest req) {

    HttpSession session = req.getSession();

    if (session != null) {

        session.invalidate();//触发LogoutListener

    }

    return "redirect:/";

}

  sso认证中心有一个全局会话的监听器,一旦全局会话注销,将通知所有注册系统注销

1

2

3

4

5

6

7

8

public class LogoutListener implements HttpSessionListener {

    @Override

    public void sessionCreated(HttpSessionEvent event) {}

    @Override

    public void sessionDestroyed(HttpSessionEvent event) {

        //通过httpClient向所有注册系统发送注销请求

    }

}

come from:单点登录原理与简单实现 - ywlaker - 博客园 (cnblogs.com)

单点登录(java)相关推荐

  1. SSO 单点登录(java)

    1.1 创建客户端 / 认证服务器 使用Spring Initializr 初始化springBoot项目. 添加基本依赖 1.2 编排配置 properties Client1 客户端配置 Clie ...

  2. ad 单点登录 java 访问权限_AD 单点登录以及windows认证详细说明

    上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证. Forms身份认证虽然使用广泛,不过,如果是在 Windows Ac ...

  3. ad 单点登录 java 访问权限_如何配置Portal 基于AD的单点登录配置

    Portal for ArcGIS支持两种类型的账户,分别是: 1.系统内置账户. 2.外部系统的企业账户. 这两种不同的账号分别支持多种身份认证方式: 账号类型 认证方式 细分认证方式 系统内置账号 ...

  4. php 单点登录实现代码,PHP简单实现单点登录功能示例

    1.准备两个虚拟域名 127.0.0.1  www.openpoor.com 127.0.0.1  www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...

  5. java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)

    cas实现单点登录,登出(java跟php客户端)(转)cas实现单点登录,登出(java和php客户端) (转) 最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php ...

  6. JAVA springboot ssm b2b2c多用户商城系统源码-SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  7. python 单点登录_清华园计算机系联合推出的Java+Python视频曝光

    Java 和 Python 双方都有各自适合和发展的领域,所以别人常问我学习什么语言好,或者让我在两种语言进行比较好坏. 其实编程语言只有适不适合你个人去学,并不存在好坏,每种语言的存在即是合理的,你 ...

  8. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案

    问题分析 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录统一身份认证平台,再通过单点登录方式登录正方教务系统,最后获取相关信息.模拟浏览器正常操作,封装请求头信息获取SES ...

  9. C# ASP.NET程序员整合Java门户单点登录PHPwind论坛博客软件集成项目经验总结

    为什么80%的码农都做不了架构师?>>>    有人曾问,如何正确估算项目周期?你是天天写C#程序的程序员,若做了一个 PHPwind 的单点登录,那估计需要几天时间? 客户只提了一 ...

  10. java heroku_使用Spring Boot和Heroku在20分钟内完成Java的单点登录

    java heroku 建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现. 注册 ,再也不 ...

最新文章

  1. 编者序:初衷、计划、要求、优势、目标和展望
  2. 传统企业应用转型--从0到1的微服务之路
  3. JSP+Servlet+Ajax实现用户增删改查的例子
  4. java实现对HDFS增删改查(CRUD)等操作
  5. VTK:图表之TreeToMutableDirectedGraph
  6. JavaFX UI控件教程(五)之Radio Button
  7. ASP.NET 2.0 中动态添加 GridView 模板列
  8. c++ 常用字符串封装函数
  9. SAP License:SAP Business One 与SAP R/3的区别
  10. python创意小作品-[专题]在Python教学中应用turtle创意编程实践
  11. linux-32bit-内存管理
  12. Greedy Mouse 贪心的耗子 nyoj824(贪心算法)
  13. centos7 搭建安装zabbix3.0邮件告警实例(二)
  14. 《Frustum PointNets for 3D Object Detection from RGB-D Data》论文及代码学习(二)——代码部分
  15. jquery进度条_jQuery进度栏
  16. 第一届腾讯社交广告高校算法大赛经验分享
  17. springboot:运行(部署)时出现WebServerException: Unable to create tempDir.
  18. for what? so what?
  19. 用C 制作含万年历的台历(2009年样张)之1
  20. 每天10个前端小知识(1day)

热门文章

  1. java cropper_layui剪裁插件cropper一个页面调用多次问题解决
  2. 如何学习平面设计色彩搭配原理
  3. 【平面设计基础】11:配色——配色原理
  4. 《Python程序设计基础(第2版)》习题答案
  5. Day23:算法之分支定界
  6. 安卓手机怎么设置蓝牙耳机弹窗动画_AirPods Pro 搭配安卓一个月深度体验
  7. XUI框架实现自带的tablayout(TabBar指示器)+viewpage实现页面切换?
  8. 用python 开发FreeCad 入门
  9. 解构语音交互产品--人工智能AI技术
  10. 353万播放0转化背后,虚假繁荣的微博生态