早期单一服务器,用户认证
缺点:单点性能压力,无法扩展
WEB应用集群,session共享模式
解决了单点性能瓶颈。
问题:
- 多业务分布式数据独立管理,不适合统一维护一份session数据。
- 分布式按业务功能切分,用户、认证解耦出来单独统一管理。
- cookie中使用jsessionId 容易被篡改、盗取。
- 跨顶级域名无法访问。
分布式,SSO(single sign on)模式
解决 :
- 用户身份信息独立管理,更好的分布式管理。
- 可以自己扩展安全策略
- 跨域不是问题
缺点:
认证服务器访问压力较大。
业务流程图
认证中心模块(oauth认证)
数据库表:user_info,并添加一条数据!密码应该是加密的!
在设计密码加密方式时 一般是使用MD5+盐的方式进行加密和解密。
登录功能
业务:
- 用接受的用户名密码核对后台数据库
- 将用户信息写入redis,redis中有该用户视为登录状态。
- 用userId+当前用户登录ip地址+密钥生成token
- 重定向用户到之前的来源地址,同时把token作为参数附上。
生成token
JWT(Json Web Token) 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录。JWT 最重要的作用就是对 token信息的防伪作用。
JWT的原理,一个JWT由三个部分组成:公共部分、私有部分、签名部分。最后由这三者组合进行base64编码得到JWT。
- 公共部分:主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。
- 私有部分:用户自定义的内容,根据实际需要真正要封装的信息。
- 签名部分:根据用户信息+盐值+密钥生成的签名。如果想知道JWT是否是真实的只要把JWT的信息取出来,加上盐值和服务器中的密钥就可以验证真伪。所以不管由谁保存JWT,只要没有密钥就无法伪造。
例如:usrInfo+ip=密钥。
base64编码,并不是加密,只是把明文信息变成了不可见的字符串。但是其实只要用一些工具就可以吧base64编码解成明文,所以不要在JWT中放入涉及私密的信息,因为实际上JWT并不是加密信息。
验证功能
功能:当业务模块某个页面要检查当前用户是否登录时,提交到认证中心,认证中心进行检查校验,返回登录状态、用户Id和用户名称。
业务:
- 利用密钥和IP检验token是否正确,并获得里面的userId
- 用userId检查Redis中是否有用户信息,如果有延长它的过期时间。
- 登录成功状态返回。
业务模块页面登录情况检查
问题:
- 由认证中心签发的token如何保存?
- 难道每一个模块都要做一个token的保存功能?
- 如何区分请求是否一定要登录?
回答:
- 登录成功后将token写到cookie中
- 加入拦截器:首先这个验证功能是每个模块都要有的,也就是所有web模块都需要的。在每个controller方法进入前都需要进行检查。可以利用在springmvc中的拦截器功能。因为咱们是多个web模块分布式部署的,所以不能写在某一个web模块中,可以是一个公共的web模块,加入拦截器。
- 检验方法是否需要验证用户登录状态:为了方便程序员在controller方法上标记,可以借助自定义注解的方式。比如某个controller方法需要验证用户登录,在方法上加入自定义的@LoginRequie。
什么是CAS?
中央认证服务,企业级单点登录解决方案。CAS(Central Authentication Service),是耶鲁大学开发的单点登录系统(SSO,single sign-on),应用广泛,具有独立于平台的,易于理解,支持代理功能。CAS系统在各个大学如耶鲁大学、加州大学、剑桥大学、香港科技大学等得到应用。CAS 的设计目的:
- 为多个Web应用提供单点登录基础设施,同时可以为非Web应用但拥有Web前端的功能服务提供单点登录的功能;
- 简化应用认证用户身份的流程;
- 将用户身份认证集中于单一的Web应用,让用户简化他们的密码管理,从而提高安全性;而且,当应用需要修改身份验证的业务逻辑时,不需要到处修改代码。
- CAS Server 需要独立部署,主要负责对用户的认证工作;
- CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。
单点登录的访问或者跨域问题
- 单点登录:单点登录是相互信任的系统模块登录一个模块后,其他模块不需要重复登录即认证通过。项目采用的是CAS单点登录框架完成的。首先CAS有两大部分。客户端和服务端。服务端就是一个web工程部署在tomcat中。在服务端完成用户认证操作。每次访问系统模块时,需要去CAS完成获取ticket。当验证通过后,访问继续操作。对于CAS服务端来说,我们访问的应用模块就是CAS客户端。
- 跨域问题:首先明白什么是跨域。什么时候涉及跨域问题。当涉及前端异步请求的时候才涉及跨域。那什么是跨域呢?当异步请求时,访问的请求地址的协议、ip地址、端口号任意一个与当前站点不同时,就会涉及跨域访问。解决方案:1、jQuery提供了jsonp实现2、W3C标准提供了CORS(跨域资源共享)解决方案。
单点登陆如果在另一台电脑上登陆并修改了密码怎么办?
单点登录系统(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。要实现SSO,需要以下主要的功能:
- 所有应用系统共享一个身份认证系统:认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。
- 所有应用系统能够识别和提取ticket信息:要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。当用户在另一终端登陆并修改密码,则对应的ticket附带的信息会发生改变,导致原有ticket因无法通过校验而失效。因此要求用户使用新的密码重新登陆。