单系统登录
1. http无状态协议
http是无状态的协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联。这同时意味着,任何用户都能通过浏览去访问服务器资源,如果想保护服务器的某些资源必须限制浏览器的请求。响应合法请求,忽略非法请求。而要鉴别浏览器的请求就必须清除浏览器的请求状态,既然http无状态,那就然服务器和浏览器共同维护一个状态,这就是会话机制。
2. 会话机制
浏览器第一次请求服务器,服务器创建一个会话,并将此会话的id作为响应的一部分发送给浏览器,浏览器存储会话id,并在后续请求中带上会话id,服务器取得请求中的会话就知道是不是同一个用户了、
这样后续请求就与第一次请求产生关联。服务器在内存中保存会话id。在浏览器端有两种方式,请求参数或者cookie,使用请求参数id作为每一个请求的参数,但是这样显然是不靠谱的,不可能让用户每次请求的时候还得取查询这个会话id加到请求里。所以得让浏览器自动发送会话id,所以就有了cookie,它是浏览器用来存储少量数据的一种机制。数据以"key/value"形式存储,浏览器发送http请求时自动附带cookie信息。
在tomcat会话机制中,浏览器可以看到一个叫JSESSIONID的cookie。
3. 登录状态
在第一次请求中,服务器拿到了用户名和密码,与数据库中的信息作对比,如果通过验证,则说明这个用户是合法的,就将会话标记位true表示已登录。用户再次访问时,tomcat在会话对象中查看登录状态。只有状态为true时才能访问。
多系统的复杂性
web系统早已经从久远的单系统发展为如今的多系统组成的应用群,所以用户面对如此多的系统,不可能一个个登录,一个个注销。这个责任应该由服务器内部来承担,而不是用户,对用户而言要跟单系统登录一样,只登陆注销一次就好了。
单系统登录解决方案的核心是cookie,而cookie是有限制的,浏览器发送jttp请求时会自动携带与该域匹配的cookie而不是所有cookie。而且应用群各系统使用的技术要相同,共享cookie的方式无法实现跨语言平台,还有cookie本身是不安全的。
单点登录
概述
单点登录全称Single Sign On 简称为SSO,是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包含单点登录和单点注销两部分。
1. 登录
相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登陆入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,令牌作为参数发送给各个子系统,子系统拿到令牌,可以借此创建局部会话,局部会话登录方式与单系统的方式相同。
- 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;
- sso认证中心发现用户为登录,将用户引致登录页面;
- 用户输入用户名和密码提交登录申请;
- sso认证中心校验用户信息,创建用户与sso认证中心的会话,称为全局会话,同时创建授权令牌;
- sso认证中心带着授权令牌跳转到最初的请求地址系统1;
- 系统1拿到令牌,去sso校验令牌是否有效;
- sso认证中心检验令牌有效,并注册系统1;
- 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护的资源;
- 用户访问系统2的受保护资源;
- 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;
- sso认证中心发现用户已登录,返回跳转至系统2,并附带授权令牌;
- 系统2拿到授权令牌去sso认证中心去检验令牌是否有效;
- sso返回有效,注册系统2;
- 系统2使用该令牌创建与用户的局部会话,返回受保护资源。
2. 注销
- 用户向系统1发起注销请求;
- 系统1根据用户与系统1建立的局部会话id拿到 令牌,向sso认证中心发起注销请求;
- sso认证中心校验令牌有效,销毁全局会话,同事取出所有用此令牌注册的系统地址;
- sso认证中心向所有注册系统发起注销请求;
- 各注册系统接收sso认证中心的注销请求,销毁各自的局部会话
- sso认证中心引导用户至登录页面。
四、 部署图
单点登录涉及sso认证中心与众子系统,子系统与sso认证中心需要通信以交换令牌、校验令牌及发起注销请求,因而子系统必须集成sso的客户端,sso认证中心则是sso服务端,整个单点登录过程实质上是sso客户端与服务端通信的过程。