SSO单点登录可以自己实现吗?--开源软件诞生10
ERP与SSO的恩怨情仇--第10篇
用日志记录“开源软件”的诞生
赤龙 ERP 开源地址:
点亮星标,感谢支持,与开发者交流 kzca2000
码云:https://gitee.com/redragon/redragon-erp
GitHub:https://github.com/redragon1985/redragon-erp
赤龙ERP官网:https://www.redragon-erp.com
为什么要用单点登录
首先大部分系统都不是孤立存在的,尤其是信息化系统。它们往往在一个大的平台上,由多个独立的系统组成。如果想访问多个系统,那么多次重复的进行登陆往往是不能接受的,那么一个统一的登陆入口就变得必不可少。这就是单点登录。
单点登录的特点是:
(1)统一的登陆入口和注销入口
(2)共享的用户信息数据
(3)可实现跨域、跨多应用、跨多浏览器的认证
(4)可实现较高的安全认证机制
(5)可扩展的授权机制
是否需要实现自己的SSO
是否需要实现自己的SSO呢?要回答这个问题。首先要明白SSO是如何实现的。那我们先来看看登陆如何实现,常见的做法是,输入用户名、密码、验证码,点击登陆验证用户名和密码是否正确,验证通过后获取用户信息,并跳转请求的页面。登陆状态和用户信息一般会存储在session、cookie或本地缓存;当然有时还会引入token验证登陆状态。
这个过程看似实现很简单,但里面有个致命的问题,不管session、cookie或本地缓存,都是存储在应用服务器本地的,这就使得统一认证、共享状态、跨域等多个问题变得不可能。下面我们来看看SSO是如何做的:
(1)当客户端发送请求访问应用的某一路径,应用会先判断当前用户本地的登陆状态,如果当前用户存在登陆状态则正常访问;如果用户没有登录则重定向到单点登录的服务端
(2)单点登录服务端会先通过cookie验证当前用户在服务端存储的登陆状态,如果存在则跳转回应用路径,并在客户端存储登陆状态。如果当前用户没有登录,则进行用户认证。(即输入用户名和密码的登陆动作)
(3)服务器认证成功后,会产生一个票据,带着这个票据并设置cookie跳转回客户端的接收路径
(4)客户端会在接收路径中重新访问服务端,去验证票据的合法性,成功后反馈用户的认证信息和相关数据给客户端
现在明白了单点登录是如何实现的,下面来回答本节开始的问题。要看使用场景,如果是互联网的项目我建议自己实现或优化此流程实现,但我现在研发的是一款开源ERP,在考虑安全性,可扩展性、时间成本等多方面的前提下,当然没有必要自己开发,拿成熟的产品优化即可。下面来看看我做了哪些优化。
CAS与Shiro的整合
CAS是Apache的开源SSO,解决的是认证的问题;Shiro是安全性框架,解决的是授权和会话管理。这也是【赤龙ERP】使用的两个技术。基本流程是:
(1)Cas先做用户认证,并获取用户信息(此过程通过SSL加密)。
(2)Shiro与Cas整合,在cas认证成功后交由shiro绑定认证状态、用户信息,并在shiro中获取用户权限,所有信息均存储在会话中。
(3)通过shiro配置实现对所有请求的拦截,并可以通过标签控制页面显示的内容(shiro的授权都是通过角色和权限两级完成的)。
【赤龙ERP】对CAS和Shiro做了哪些优化
其实不管是Cas和Shiro本来的功能上都有一些欠缺,在【赤龙ERP】中我做了相关优化。
(1)cas的登录页面的客户化,cas本身的登陆页面不好看,所以需要针对不同的场景做客户化。
(2)cas的登录页面更多数据的提交,本身登陆页面只接受用户名和密码的提交,不支持其他字段,但往往有时需要提交更多的字段,比如:账套。
(3)cas对于通过接口进行用户验证的功能比较欠缺,在此也做了弥补。
(4)cas记住密码的功能在和Shiro整合后存在一些问题,在此已解决。
(5)cas用户注销和Shiro整合后,存在一些情况下无法同步注销的问题,在此已解决。
(6)Shiro本身的会话存储在Ehcache本地缓存中,但整合Cas后会出现跨域、跨浏览器、跨应用的数据同步问题,优化后将会话存储在Redis中。
希望您读完本文可以帮助笔者进入【码云】或【GitHub】搜索“赤龙ERP”点击星标。等待着您的支持!
SSO单点登录可以自己实现吗?--开源软件诞生10的更多相关文章
- CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- CAS实现SSO单点登录原理(转)
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- SpringCloud系列——SSO 单点登录
前言 作为分布式项目,单点登录是必不可少的,文本基于之前的的博客(猛戳:SpringCloud系列——Zuul 动态路由,SpringBoot系列——Redis)记录Zuul配合Redis实现一个简单 ...
- 转 CAS实现SSO单点登录原理
原文链接 http://m.blog.csdn.net/hxpjava1/article/details/74019017 CAS 简介 1. 1.1. What is CAS ? CAS ( ...
- SSO单点登录的发展由来以及实现原理【转】
单点登录以及权限,在很早之前都有写过,不过都比较简单,今天就具体说一下,以及下一步要做的 1.web单系统应用 早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的, ...
- 一篇文章彻底弄懂CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web ...
- Java项目接入sso单点登录
最近在落地cat(java开发的一款开源监控系统)接入公司的内部项目,其中有项需求是接入公司的sso单点登录系统.研究了公司之前java项目接入sso系统,大部分是采用spring框架,然后依赖spr ...
- 开发SSO单点登录需要注意的问题
一.单点登录系统开发需要注意的问题 1.单点登录系统需要支持jsonp请求? 单点登录系统主要是向其他系统提供用户身份验证服务,因此需要提供对外接口,而外部系统通过接口访问时,必然涉 ...
- 基于CAS实现SSO单点登录
1. 概述 1.1. 什么是SSO? 单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要 登录一 ...
随机推荐
- xss-labs 通关学习笔记
xss-labs 学习 By:Mirror王宇阳 time:2020/04/06 level1 我们进入到这个页面之后,快速关注到几个点,Xss注重的输入点,这里的输入点首先在URL栏中找到了name ...
- Azure认知服务之使用墨迹识别功能识别手写汉字
前面我们使用Azure Face实现了人脸识别.使用Azure表格识别器提取了表格里的数据.这次我们试试使用Azure墨迹识别API来对笔迹进行识别. 墨迹识别 墨迹识别器认知服务提供基于云的 RES ...
- JavaScript学习系列博客_18_JavaScript中的匿名函数
匿名函数 - 用函数声明的方式创建一个函数时,不加函数名称. function sum(){ console.log("我是函数sum")} - 不加名称,这样写浏览器是会报错的. ...
- 第8章 Spark SQL实战
第8章 Spark SQL实战 8.1 数据说明 数据集是货品交易数据集. 每个订单可能包含多个货品,每个订单可以产生多次交易,不同的货品有不同的单价. 8.2 加载数据 tbStock: scala ...
- magento2 pub/static没有adminhtml,frontend的解决方案
(1) 运行php bin/magento setup:static-content:deploy (2) 检查pub/static有没有.htaccess文件 (3) php bin/magento ...
- 【Flutter 实战】动画序列、共享动画、路由动画
老孟导读:此篇文章是 Flutter 动画系列文章第四篇,本文介绍动画序列.共享动画.路由动画. 动画序列 Flutter中组合动画使用Interval,Interval继承自Curve,用法如下: ...
- Hive 常见面试题(一)
面试题: hive 内部表和外部表的区别? hive 是如何实现分区的? Hive 有哪些方式保存元数据,各有哪些优缺点? hive中order by.distribute by.sort by和cl ...
- Nginx反向代理的使用
一.Nginx的基本命令 nginx:启动 nginx nginx -t :测试配置文件是否有语法错误 nginx -s reopen:重启Nginx nginx -s reload:重新加载Ngin ...
- 跟我一起学.NetCore之日志作用域及第三方日志框架扩展
前言 上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等:当然还有很多细节没深入讲解,抽时间小伙伴 ...
- 寻找链表的倒数第k个节点
寻找链表的倒数第k个节点 题目:已知一个带有表头结点的单链表,节点结构为(data,next),假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个 ...