Shiro单点登录过程和重定向问题分析

Shiro单点登录过程和重定向问题分析
Shiro单点登录过程和重定向问题分析
[if !supportLists]1.  [endif]技术背景
单点登录(Single Sign On),简称为 SSO,是⽬前⽐较流⾏的企业业务整合的解决⽅案之⼀。SSO的定义是在多个应⽤系统中,⽤户只需要登录⼀次就可以访问所有相互信任的应⽤系统。
1.1 Session
Http协议是⼀种⽆状态协议,即每次服务端接收到客户端的请求时,都是⼀个全新的请求,服务器并不知道客户端的历史请求记录;Session的主要⽬的就是为了弥补Http的⽆状态特性,服务器可以利⽤session存储客户端在同⼀个会话期间的⼀些操作记录;
会话机制:浏览器第⼀次请求服务器,服务器创建⼀个会话,并将会话的id作为响应的⼀部分发送给浏览器,浏览器存储会话id,并在后续第⼆次和第三次请求中带上会话id,服务器取得请求中的会话id判断是否是同⼀个⽤户。
1.1.1 session保存⽅式
浏览器端:存放在浏览器cookie中,⽣命周期是session,当浏览器关闭时cookie会消失。(session劫持)。
Tomcat session 以CurrentHashMap的数据结构存储。
tomcat中多个会话对应的session是由ManagerBase类来维护,查看其代码,可以发现其有⼀个sessions成员属性,存储着各个会话的session信息:
/**
* The set of currently activeSessions for this Manager, keyed by
* session identifier.
*/
protected Map sessions = new ConcurrentHashMap();
1.1.2 Session的⽣成
Tomcat
session⽣成器的类实现,SessionIdGeneratorBase,实现代码如下
public String generateSessionId() {
ateSessionId(this
this.jvmRoute);
return this
}
public String generateSessionId(String route) {
new byte[16];
byte[] random =new byte
byte
int
int sessionIdLength =this
StringBuilder buffer =new new StringBuilder(2 * sessionIdLength + 20);
int int resultLenBytes = 0;
while while(resultLenBytes < sessionIdLength) {
RandomBytes(random);
for for(int int j = 0; j < random.length && resultLenBytes < sessionIdLength; ++j) {
byte byte b1 = (byte byte)((random[j] & 240) >> 4);刘震云单位
byte byte b2 = (byte byte)(random[j] & 15);
if if (b1 < 10) {
buffer.append((char char)(48 + b1));
}else else {
buffer.append((char char)(65 + (b1 - 10)));
}
if if (b2 < 10) {
buffer.append((char char)(48 + b2));
}else else {
buffer.append((char char)(65 + (b2 - 10)));
}
中央人民政府政务院++resultLenBytes;
}
}
if if (route !=null null && route.length() > 0) {
buffer.append('.''.').append(route);
}else else {
String jvmRoute =JvmRoute();
if if (jvmRoute !=null null && jvmRoute.length() > 0) {
buffer.append('.''.').append(jvmRoute);
}
}
return String();
}
1.1.3 session
ID⽣产算法
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进⾏随机时,随机算法的起源数字称为种⼦数(seed),在种⼦数的基础上进⾏⼀定的变换,从⽽产⽣需要的随机数字,当种⼦可知时,随机数也是可知的。
[if !supportLists]·        [endif]SecureRandom类提供加密的强随机数⽣成器(RNG)
使⽤的随机数⽣成⼯具SecureRandom⼯具⽣成随机数。
byte[] bytes) {
protected void getRandomBytes(byte
this.randoms.poll();
SecureRandom random = (SecureRandom)this
null) {
if (random ==null
if
random =this
}
this
this.randoms.add(random);
}
过敏疹
SecureRandom的实现算法,NativePRNG,否则就是SHA1PRNG。
操作系统收集了⼀些随机事件,⽐如⿏标点击,键盘点击等等,SecureRandom 使⽤这些随机事件作为种⼦,从⽽使得种⼦不可预测。
1.2 单系统登录实现。
1.2.1 会话维护
会话机制中,浏览器第⼀次请求服务器需要输⼊⽤户名与密码验证⾝份,服务器拿到⽤户名密码去数据库⽐对,验证通过则说明当前持有这个会话的⽤户是合法⽤户,应该将这个会话标记为“已授权”或者“已登录”等等之类的状态,并将信息保存在session中,tomcat在会话对象中设置登录状态如下
1
2
HttpSession session = Session();
session.setAttribute("isLogin", true);
⽤户再次访问时,tomcat在会话对象中查看登录状态
1
2
HttpSession session = Session();
1.2.2 处理过程
实现了登录状态的浏览器请求服务器模型如下图描述
1.3 多系统情况下登录实现。
1.3.1 同域名下session共享的⽅式。
利⽤cookie的特性和session共享实现单点登录。但是⽆法实现跨域的情况。
我们在设置Cookie时,只能设sso登录后,可以将Cookie的域设置为顶域,例如.a,这样所有⼦域的系统都可以访问到顶域的Cookie。我们在设置Cookie时,只能设置顶域和⾃⼰的域,不能设置其他的域。⽐如:我们不能在⾃⼰的系统中给baidu的域设置Cookie。这样所有的⼦系统都会带上该cookie。
多服务器的Sesssion共享实现cookie session的统⼀验证。
在sso系统登录了,这时再访问app1,Cookie也带到了app1的服务端(Server),app1的服务端把系统的Session共享。共享Session的解决⽅案有很多,例如:Spring-Session。
1.3.2 CAS实现单点登录。CentralAuthentication Service
CAS是Central
Authentication Service的简称,统⼀认证中⼼。CAS认证协议定义了统⼀认证的交互过程,同时CAS发⾏了3个版本。
V1实现单点登录。
V2增加代理模式,代理模式是⼀种更复杂形式的认证,即认证的Web应⽤(CAS Client)可以作为代理直接访问需要认证的后端服务(如邮件服务器),浏览器⽤户⽆需再和后端服务直接进⾏认证交互。
v3版本则更加丰富了协议,认证中⼼验证票据后不仅可以返回⾝份ID,还可携带⽤户昵称、性别等其他⽤户基本信息。
单点登录全称Single Sign On(以下简称SSO),是指在多系统应⽤中登录⼀个系统,便可在其他所有系统中得到授权⽽⽆需再次登录,包括单点登录与单点注销两部分。
相⽐于单系统登录,sso需要⼀个独⽴的认证中⼼,只有认证中⼼能接受⽤户的⽤户名密码等安全信息,其他系统不提供登录⼊⼝,只接受认证中⼼的间接授权。间接授权通过令牌实现,sso认证中⼼
验证⽤户的⽤户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个⼦系统,⼦系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录⽅式与单系统的登录⽅式相同。这个过程,也就是单点登录的原理。
讯泰科技[if !supportLists]1)  [endif]登录过程
相⽐于单系统登录,sso需要⼀个独⽴的认证中⼼,只有认证中⼼能接受⽤户的⽤户名密码等安全信息,其他系统不提供登录⼊⼝,只接受认证中⼼的间接授权。间接授权通过令牌实现,sso认证中⼼验证⽤户的⽤户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个⼦系统,⼦系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录⽅式与单系统的登录⽅式相同。这个过程,也就是单点登录的原理,⽤下图说明。
下⾯对上图简要描述
[if !supportLists]1)  [endif]⽤户访问系统1的受保护资源,系统1发现⽤户未登录,跳转⾄sso认证中⼼,并将⾃⼰的地址作为参数
[if !supportLists]2)  [endif]sso认证中⼼发现⽤户未登录,将⽤户引导⾄登录页⾯
[if !supportLists]3)  [endif]⽤户输⼊⽤户名密码提交登录申请
丁惟宁
[if !supportLists]4)  [endif]sso认证中⼼校验⽤户信息,创建⽤户与sso认证中⼼之间的会话,称为全局会话,同时创建授权令牌
[if !supportLists]5)  [endif]sso认证中⼼带着令牌跳转会最初的请求地址(系统1)
[if !supportLists]6)  [endif]系统1拿到令牌,去sso认证中⼼校验令牌是否有效
[if !supportLists]7)  [endif]sso认证中⼼校验令牌,返回有效,注册系统1
[if !supportLists]8)  [endif]系统1使⽤该令牌创建与⽤户的会话,称为局部会话,返回受保护资源
[if !supportLists]9)  [endif]⽤户访问系统2的受保护资源
[if !supportLists]10)[endif]系统2发现⽤户未登录,跳转⾄sso认证中⼼,并将⾃⼰的地址作为参数
[if !supportLists]11)[endif]sso认证中⼼发现⽤户已登录,跳转回系统2的地址,并附上令牌
点线面构成
[if !supportLists]12)[endif]系统2拿到令牌,去sso认证中⼼校验令牌是否有效
[if !supportLists]13)[endif]sso认证中⼼校验令牌,返回有效,注册系统2
[if !supportLists]14)[endif]系统2使⽤该令牌创建与⽤户的局部会话,返回受保护资源
⽤户登录成功之后,会与sso认证中⼼及各个⼦系统建⽴会话,⽤户与sso认证中⼼建⽴的会话称为全局会话,⽤户与各个⼦系统建⽴的会话称为局部会话,局部会话建⽴之后,⽤户访问⼦系统受保护资源将不再通过sso认证中⼼,全局会话与局部会话有如下约束关系
[if !supportLists]1)  [endif]局部会话存在,全局会话⼀定存在
[if !supportLists]2)  [endif]全局会话存在,局部会话不⼀定存在
[if !supportLists]3)  [endif]全局会话销毁,局部会话必须销毁
问题点:
SSO系统登录后,跳回原业务系统时,带了个参数ST,业务系统还要拿ST再次访问SSO进⾏验证,觉得这个步骤有点多余。他想SSO登录认证通过后,通过回调地址将⽤户信息返回给原业务系统,原业务系统直接设置登录状态,这样流程简单,也完成了登录,不是很好吗?
如果在SSO没有登录,⽽是直接在浏览器中敲⼊回调的地址,并带上伪造的⽤户信息,业务系统也认为登录,会产⽣安全问题。
[if !supportLists]2)  [endif]注销过程
单点登录⾃然也要单点注销,在⼀个⼦系统中注销,所有⼦系统的会话都将被销毁,⽤下⾯的图来说明
sso认证中⼼⼀直监听全局会话的状态,⼀旦全局会话销毁,将通知所有注册系统执⾏注销操作。
下⾯对上图简要说明
[if !supportLists]1)  [endif]⽤户向系统1发起注销请求
[if !supportLists]2)  [endif]系统1根据⽤户与系统1建⽴的会话id拿到令牌,向sso认证中⼼发起注销请求

本文发布于:2024-09-21 13:55:45,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/241947.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:登录   系统   认证   请求   会话   服务器   单点
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议