单点登录系统

单点登录系统保存了用户的登录名和密码,上网用户在单点登录系统中认证成功后,就可以直接登录各个业务系统。

1. 用户使用单点登录系统的登录界面,输入用户名和密码登录成功后,
单点登录系统为用户浏览器安装一个cookie,cookie的值是一个全局唯
一的字符串 (下文称为ticket),理论上这个唯一值永远不能重复,用来
标识用户成功的登录请求。同一个用户,在同一个时刻登录两次,得到的
ticket值 应该完全不同。
2. 用户访问业务系统时,如果当前用户已经在业务系统中登录,那么访问
业务系统的cookie中,会携带单点登录ticket,业务系统根据此ticket,去
单点登录系统中查询用户是否在线,如果在,就允许继续访问,否则就执行
注销操作
3. 用户在任意一个业务系统中执行注销操作时,业务系统在拦截注销操作,
并且与单点登录系统联动,在单点登录系统中完成注销后,再跳转回业务系
统的注销界面

优点

1. 单点登录系统的整套拦截和转发流程,可以封装成为公共组件,代码修改量少
2. 所有业务系统都可以使用上述方案增加与单点登录系统的联动功能

缺点

上述单点登录功能,依赖浏览器的cookie功能,如果浏览器不支持cookie,将无法使用
关于这个方案的安全性问题,可以通过定期更新ticket值,或每次访问都生成不同的ticket值来进行规避。
因为涉及对于单点登录系统的大量访问,所以会使得单点登录系统成为瓶颈,我们项目中采用性能更高的网络协议,
例如UDP协议进行在线状态交互,因为UDP报文头部较小,报文有效内容比例大,同时报文长度短,比现有的HTTP协议性能高2个数量级,每秒支撑1000次查询请求,是没有问题的.

我们使用了JWT来做用户的状态保持机制和数据认证

因为JWT的token是保存在浏览器端的,不影响服务器开销,
多台服务器也可以使用,不需要多次登录,会保存在浏览器一
个空间里,这个空间加密性比cookie强,即使cookie被截获,
也不会泄露用户信息,比较安全.
JWT一般会采用消息认证机制:在哈希算法基础上混入秘钥,
防止哈希算法被破解, 避免签名被伪造,效率比较高.

JWT白名单

在用户完成修改密码操作时. 将该用户加入到白名单中,
先根据用户身份的唯一标识判断用户是否在白名单中,如
果在,说明用户在token有效期内已经修改过一次密码, 现
在就需要先删除用户白名单中的token数据,用户修改完密
码后, 需要让用户重新进行登录生成新的access_token返
回给客户端,调用生成token的工具生成access_token(访
问token)的数据,判断用户是否有对应的白名单,如果有则将
该token值存入到redis数据库的白名单中.
当用户登录成功后,再进行用户认证,在验证token成功后, 
对该用户的白名单进行验证,判断该用户是否在白名单中,
如果在,则验证token是否在白名单中,如果在则允许用户访问,
如果不在则不允许用户访问, 返回错误

 JWT黑名单

关于登录状态信息续签的问题。比如设置token的有效期为一个小时,
那么一个小时后,如果用户仍然在这个web应用上,这个时候当然不
能指望用户再登录一次。所以我们在每次用户发出请求的时候都返回
一个新的token,前端再用这个新的token来替代旧的,这样每一次请
求都会刷新token的有效期。但是这样,需要频繁的生成token。另外
一种方案是使用Js来动态续签。判断还有多久这个token会过期,在
token快要过期时,返回一个新的token。
用户主动注销,后台无法让用户强制下线。JWT并不支持用户主动退
出登录,当然,可以在客户端删除这个token,但在别处使用的token
仍然可以正常访问。为了支持注销和后台主动强制让用户下线, 我们在
项目中的方案是在注销时将该token加入黑名单。当用户发出请求后,
如果该token在黑名单中,则阻止用户的后续操作,返回Invalid token
错误。对于名单的维护可以使用redis,token的过期时间和redis中数
据的存活时间保持一致。

JWT黑名单和白名单的更多相关文章

  1. Postfix邮件黑名单和白名单

    本文主要介绍如何用Postfix添加域名黑名单和白名单,用以处理垃圾邮件. 1.修改postfix主配置文件,增加限制语句 vim /etc/postfix/main.cf # 文末添加一行,限制往本 ...

  2. Proxy SwitchyOmega 使用黑名单和白名单

    “黑名单”会告诉代理工具,黑名单(国外)里面的网站要使用代理:“白名单”会告诉代理工具,白名单(大陆网站)里面的网站直接连接,其余使用代理. 黑名单PAC 黑名单PAC两条(任选其一):https:/ ...

  3. charles 白名单

    本文参考:charles 白名单 charles 白名单 白名单工具,允许您阻止除选定位置之外的所有请求. 注意:如果一个请求与"黑名单"和"白名单"同时匹配成 ...

  4. [WebServer] Tomcat 配置访问限制:访问白名单和访问黑名单

    前言: 昨天配置了 Tomcat 服务器运行 PHP 的环境,但是通过观察 Tomcat 这几天的日志发现,有很多莫名其妙的 IP 访问主机下莫名其妙的地址,如:/80./testproxy.php. ...

  5. RouteOS软路由HotSpot热点认证网关添加白名单和黑名单

    1.添加白名单和黑名单地址池 白名单IP地址池 172.18.10.0/24 黑名单IP地址池 172.18.20.0/24 2.添加IP网关 白名单网关 172.18.10.0/24 黑名单网关 1 ...

  6. servlet过滤器配置白名单、黑名单

    1.web.xml配置 <filter> <description>过滤是否登陆</description> <filter-name>encoding ...

  7. Oracle数据库IP访问限制(IP白名单黑名单)

    1.编辑sqlnet.ora 内容为: #允许访问的IP(白名单) TCP.INVITED_NODES=(127.0.0.1,192.168.56.109,ip2,ip3,..,..本地IP..)若使 ...

  8. Tomcat 配置访问限制:访问白名单和访问黑名单

    最近公司的阿里云服务器上配置的 Tomcat 服务器运行 java的环境,但是通过观察 Tomcat 这几天的日志发现,有很多莫名其妙的 IP 访问主机下莫名其妙的地址,如:/80./testprox ...

  9. PHP实现白名单或黑名单

    /**  * 安全IP检测,支持IP段检测  * @param string $ip 要检测的IP  * @param string|array $ips  白名单IP或者黑名单IP  * @retu ...

随机推荐

  1. 关于System.ExecutionEngineException异常

    什么是System.ExecutionEngineException 公共语言运行库的执行引擎中出现内部错误时引发的异常.这个类不能继承. 继承 Object Exception SystemExce ...

  2. ping fping

    通过ping来监测对端网络状态 ping fpinf在windows和linux上的参数是不同的,返回的结果也是不同的 在网络连通性监测方面用的比较多,在py go中调用命令,对返回的结果使用正则来在 ...

  3. Educational Codeforces Round 67

    Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...

  4. mysql .字符串转日期

    insert into share (uid, mapId, isdir, type, pwd, shareTime, overTime, price) values (1, 10, 0, 1,&qu ...

  5. Android中百分比布局

    百分比布局的出现主要是因为LinearLayout中可以通过android:layout_weight="1"这种方法来支持按比例指定控件大小 但是FrameLayout和Rela ...

  6. 反向传播BP算法

    前向传播模型 一般我们使用的公式是: \[ a=\frac{1}{1+\exp \left(-\left(w^{T} x+b\right)\right)} = \frac{1}{1+\exp \lef ...

  7. 第10组 Beta冲刺(1/5)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ...

  8. HTTP APIs 设计/规范指南

    根据REST APIs的成熟度模型 ,此规范关注的是Level 2的APIs.  1 设计指南 HTTP APIs主要由四部分组成:HTTP,URL,资源,资源的表述(JSON).资源的表述格式通常都 ...

  9. Java_jdbc 基础笔记之九 数据库连接 (查询Customer对象的方法)

    /** * * 写一个查询Customer对象的方法 * */ public Customer getCustomer(String sql, Object... args) { Customer c ...

  10. Oracle系列十一 数据处理

    数据操纵语言 DML(Data Manipulation Language – 数据操纵语言) 可以在下列条件下执行: 向表中插入数据 修改现存数据 删除现存数据 事务是由完成若干项工作的DML语句组 ...