借鉴文章: blog.csdn.net/xiaoguan_li…
首先说下单点登陆(sso)的场景,就是一个公司推出了好多个产品,都属于这个公司,那么登陆其中一个产品,再登陆其他产品就无需再次登陆了,即只登陆一次,访问所有该公司下的所有产品,这就是我理解的单点登陆.
例如: 我登陆了qq,那么我进入qq空间则不用再次输入账号密码,而如果我没登录qq,直接登陆qq空间,这是需要输入用户名,密码的.
如是这种模式,比较经典好用的解决方案就是,需要一个认证中心去完成.借鉴了好多文章,大概思路如下:
这个图片看起来优点乱,我来文字说明:
1 用户登陆其中一个系统,系统发现该用户未登陆(从cookie中取tocken,校验用户是否登陆)
2
那么,该子系统需要去请求认证中心(并携带该子系统地址,为了之后跳转回来),看该用户是否已经登录过(认证中心从cookie中取tocken,验证用户是否登陆),发现未登陆,那么认证中心引导至登陆页面,进行登陆,生成tocken,并写入认证中心的cookie中,并且记录此tocken与会话id(用map缓存即可,为了之后销毁用)然后取出该子系统的地址,跳转回至子系统
3
子系统拿到tocken后,立即再去认证中心验证该tocken合法性(必须验证,可能人为伪造),验证成功,子系统将tocken写入cookie中,并且记录该用户已经登陆.(session.setAttribute("用户信息",
true);)
4 用户再次访问该系统,取出步骤3中的 boolen值,如果为true,那么就跟认证中心没有关系了,直接访问就好.
5 退出登陆,既然是单点登陆,那么登陆后即可访问所有系统,退出也一样,我把它称之为单点退出.在一个子系统退出,那么需要将所有信息全部销毁,包括:
用户与认证中心建立的全局会话, 认证中心与各个系统之间建立的局部会话.
思路是:
用户在其中一个子系统注销登陆,首先取出tocken,然后将注销的消息发送给认证中心,认证中心记录了所有发放了tocken的会话id(map缓存),通过发送httpclient的方式,给map缓存中的每一个系统发送注销消息,销毁局部会话,全部销毁后,认证中心引导至登陆页面.
这就是单点登陆的一个大概思路,纯手打!!!!
要点:
1 认证中心负责: 发放tocken,验证tocken,存储会话id与tocken关系
2 所有系统中的tocken都是一样的,并且最好可以解析出用户信息
此文章纯粹为个人理解,如有问题,忘各位大佬指正,定当认真修改.
本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。