本文主要是介绍统一登录门户系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
随着等保2.0和密评工作的深入推进,各政企单位的应用系统建设会向着更安全、更标准方向发展。
为了推进整合信息共享,破除各系统之间的壁垒,首先要建设的就是统一登录门户系统。
常见的统一登录要求,还是基于一个统一的入口,由统一登录入口完成登录后,可以自由访问其他系统,而其他系统的用户登录应跳转到统一登录入口。
可能存在的问题:
1.用户系统如何建立,如何解决存量用户。
2.应符合等保要求和国密要求。
一种简单的统一登录系统,在主域名中设置cookie信息,保证在访问其他子域名时也带上cookie,通过cookie获得用户的身份信息。知识点如下:
1.基于cookie用户登录,cookie和session的关系
2.cookie的domain(域)信息
一、基础知识
1.1 cookie
cookie是http协议的产物,由server生成,通过http response发送给webbrowser,webbrowser存储在用户本地的文件,在下一次访问同一url时候,在http header中携带cookie一起发送到服务器端。cookie采用key-value的数据结果。
在OSI 网络模型中,会话层在第五层,我们熟悉的Http、FTP、SMTP是TCP/IP网络协议的应用层协议。
Http是一种无状态的连接协议,本身并没有提供会话协议。通过cookie方式,可以为http添加会话信息。
如何理解,Http是一种无状态的连接协议。当用户的一次访问请求结束后,后端服务器就无法知道下一次来访问的还是不是上次访问的用户。另一种情况,在一个NAT的网络中,有10个用户通过NAT方式访问网络,那么这10个用户的ip都是一样,10个用户访问Web服务器时,在服务端无法区分这10个用户。
当一个web系统,需要会话信息时,可以在用户登录时,在cookie中保存用户名。这样在下一次访问时,cookie信息会放在http header中,随着http请求发送到服务端,起到会话标识的作用。即同一个客户端发出的请求,每次发出的请求都会带有上一次访问时服务端设置的信息,这样服务端就可以根据之前存入 Cookie 的值来做相应的处理。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");// 设置生命周期为MAX_VALUEcookie.setMaxAge(Integer.MAX_VALUE);resp.addCookie(cookie);}
1.2 cookie域
产生Cookie的服务器可以向set-Cookie响应首部添加一个Domain属性来控制哪些站点可以看到那个cookie,例如下面:
Set-Cookie: name="wang"; domain="m.zhuanzhuan.58.com"
如果用户访问的是m.zhuanzhuan.58.com那就会发送cookie: name="wang", 如果用户访问www.aaa.com(非zhuanzhuan.58.com)就不会发送这个Cookie。
cookie的路径 Path
Path属性可以为服务器特定文档指定Cookie,这个属性设置的url且带有这个前缀的url路径都是有效的。
例如:m.zhuanzhuan.58.com 和 m.zhaunzhuan.58.com/user/这两个url。 m.zhuanzhuan.58.com 设置cookie
Set-cookie: id="123432";domain="m.zhuanzhuan.58.com";
m.zhaunzhuan.58.com/user/ 设置cookie:
Set-cookie:user="wang", domain="m.zhuanzhuan.58.com"; path=/user/
但是访问其他路径m.zhuanzhuan.58.com/other/就会获得
cookie: id="123432"
如果访问m.zhuanzhuan.58.com/user/就会获得
cookie: id="123432"cookie: user="wang"
二、cookie实现单点登录
正常情况下,同一个一级域名下的两个二级域名也不能交互使用Cookie,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因为二者的域名不完全相同。如果想要mcrwayfun.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数为.mcrwayfun.com,这样使用test1.mcrwayfun.com和test2.mcrwayfun.com就能访问同一个cookie。
在这种单点登录模型中,登录系统采用cookie保存登录信息,并设置cookie domain域为一级域名,在访问二级域名时,服务端也会获得用户的登录信息,实现了统一登录的功能。
三、session和cookie
cookie 缺点
每次请求都会携带全部的 Cookie 信息,容易造成不必要的带宽浪费。
每个浏览器对 Cookie 在同一个域名下的个数和每个 Cookie 的总大小(4kb)都有相应的限制。
数据存储在客户端,容易被拦截篡改,不安全。
客户端可以禁用 Cookie,导致功能失效。
难于管理,大型系统里每个应用都会有自己的 Cookie,加上以上的限制,容易出现数据被截取,导致数据丢失。
Session(PHP 后端为例,java是一样的)
服务端(默认设置)接受请求时,先查看 $_COOKIE 中是否存在 name 为 PHPSESSID 的键值对(value 为服务端生成的 SESSION_ID:bebfaf6c745c1a6e5f341baf2178113b)。
若不存在(第一次请求),将会自动生成 SESSION_ID,写入到 $_COOKIE 数组中(name 为 PHPSESSID, value 为 SESSION_ID),然后通过响应头返回给浏览器。
若存在(非第一次请求),则根据 value 值到设置的目录下获取相应的文件,反序列化并写入到 $_SESSION 数组供后续使用。
当服务端进行设置时,此$_SESSION 只会维持在内存中。当脚本执行结束时,将会自动把 $_SESSION 序列化后写入到 SESSION_ID 对应的文件中(创建或覆盖)。(脚本执行即http访问)
通过POST获取用户的用户名密码,当验证成功后,将用户身份信息保存在$_SESSION中,通过cookie和session实现用户登录。
优点
只将会话标识符放到 Cookie 里,减少带宽的传输。
可以存储大量的信息,基本没有空间上的限制。
数据存放在服务端,安全。
可以统一集中式管理。
联系
SESSION 为了识别会话,需要传输一个唯一的 SESSION_ID 到客户端。一般情况下,都是借助 Cookie 来传递,当然也可以通过其他方式进行传递。
Session 安全延伸
以上分析得出, Session 需要通过 SESSION_ID 来识别客户端,这就会导致一个安全隐患。当 SESSION_ID 落入第三者时,服务端将无法分辨出是否是合法的请求。SESSION_ID通常为一串随机值,除了防止泄露,还要防止通过暴力方式猜解出来。
一个简单的防御措施就是:每次请求时都生成一个新的 SESSION_ID 关联到对应的数据并将老的 SESSION_ID 删除。
百度BDUSS可以看做是一个session_id,HttpOnly属性保证javascript不能修改这个值。
四、全局Session
采用Redis替代中间件session存储,实现单点登录。
五、采用cookie实现统一登录架构
- 登录login页面,生成用户信息并保存,保存在持久化UserInfo_Server数据库或Redis中。
- 将用户信息的key,写入到cookie中,设置domain为顶级域名。
- 浏览其他页面,会携带cookie发布到后端server,server向UserInfo_Server查询用户认证信息,实现用户登录。
- 用户注销,任一个server都可以设置cookie的有效期为0,删除cookie,并调用UserInfo_Server接口修改数据库中的认证信息。
- key的生成要随机,UserInfo接口校验数字签名,保证信道加密cookie不能被窃取。
参考:
- 这一次带你彻底了解Cookie https://www.cnblogs.com/zhuanzhuanfe/p/8010854.html
- 深入理解Cookie https://www.jianshu.com/p/6fc9cea6daa2
- Cookie 和 Session https://segmentfault.com/a/1190000008928086
- SpringBootSecurity学习(09)网页版登录配置Session共享 https://segmentfault.com/a/1190000020544320
这篇关于统一登录门户系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!