统一登录门户系统

2024-06-19 10:48
文章标签 系统 登录 统一 门户

本文主要是介绍统一登录门户系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随着等保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 缺点

  1. 每次请求都会携带全部的 Cookie 信息,容易造成不必要的带宽浪费。

  2. 每个浏览器对 Cookie 在同一个域名下的个数和每个 Cookie 的总大小(4kb)都有相应的限制。

  3. 数据存储在客户端,容易被拦截篡改,不安全。

  4. 客户端可以禁用 Cookie,导致功能失效。

  5. 难于管理,大型系统里每个应用都会有自己的 Cookie,加上以上的限制,容易出现数据被截取,导致数据丢失。

Session(PHP 后端为例,java是一样的)

  1. 服务端(默认设置)接受请求时,先查看 $_COOKIE 中是否存在 name 为 PHPSESSID 的键值对(value 为服务端生成的 SESSION_ID:bebfaf6c745c1a6e5f341baf2178113b)。

  2. 若不存在(第一次请求),将会自动生成 SESSION_ID,写入到 $_COOKIE 数组中(name 为 PHPSESSID, value 为 SESSION_ID),然后通过响应头返回给浏览器。

  3. 若存在(非第一次请求),则根据 value 值到设置的目录下获取相应的文件,反序列化并写入到 $_SESSION 数组供后续使用。

  4. 当服务端进行设置时,此$_SESSION 只会维持在内存中。当脚本执行结束时,将会自动把 $_SESSION 序列化后写入到 SESSION_ID 对应的文件中(创建或覆盖)。(脚本执行即http访问)

  5. 通过POST获取用户的用户名密码,当验证成功后,将用户身份信息保存在$_SESSION中,通过cookie和session实现用户登录。

优点

  1. 只将会话标识符放到 Cookie 里,减少带宽的传输。

  2. 可以存储大量的信息,基本没有空间上的限制。

  3. 数据存放在服务端,安全。

  4. 可以统一集中式管理。

联系

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实现统一登录架构

  1. 登录login页面,生成用户信息并保存,保存在持久化UserInfo_Server数据库或Redis中。
  2. 将用户信息的key,写入到cookie中,设置domain为顶级域名。
  3. 浏览其他页面,会携带cookie发布到后端server,server向UserInfo_Server查询用户认证信息,实现用户登录。
  4. 用户注销,任一个server都可以设置cookie的有效期为0,删除cookie,并调用UserInfo_Server接口修改数据库中的认证信息。
  5. key的生成要随机,UserInfo接口校验数字签名,保证信道加密cookie不能被窃取

 

 

参考:

  1. 这一次带你彻底了解Cookie https://www.cnblogs.com/zhuanzhuanfe/p/8010854.html 
  2. 深入理解Cookie https://www.jianshu.com/p/6fc9cea6daa2
  3. Cookie 和 Session https://segmentfault.com/a/1190000008928086
  4. SpringBootSecurity学习(09)网页版登录配置Session共享 https://segmentfault.com/a/1190000020544320

 

这篇关于统一登录门户系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074815

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Spring Security重写AuthenticationManager实现账号密码登录或者手机号码登录

《SpringSecurity重写AuthenticationManager实现账号密码登录或者手机号码登录》本文主要介绍了SpringSecurity重写AuthenticationManage... 目录一、创建自定义认证提供者CustomAuthenticationProvider二、创建认证业务Us

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、