详情:如看不懂跳转此地
1.1单点登录系统
每个站点都实现了专用登录模块。各站点的登录状态相互不认可,各站点需要逐一手工登录
这样的系统,我们又称之为多点登陆系统。应用起来相对繁琐(每次访问资源服务都需要重新登录认证和授权),与此同时,系统代码的重复比较高,由此单点系统诞生。
1.2单点登录系统概述(英文:Single Sign On(缩写:SSO)。
多个站点同时访问(共用)一台认证授权服务器,用户在任意一个站点都可以登录,登录后可以免登录访问其他所有站点。而且各站点间可以通过该登录状态直接交互。例如:
打个比方:像王者荣耀选择英雄,用户可以任意选一个英雄进游戏,不管选哪个英雄都可以进入到游戏里,并且保存当前的战绩
1.3单点登录系统解决方案设计
①解决方案1:用户登录成功以后,将用户登录状态存储到redis数据库
此套方案,效果一般。
原因:当用户登录成功后,基于UUID生成一个token跟随着用户信息一同存入数据库,若用户二次访问资源时,基于token再从数据库查询用户状态(用户的数据)。相当于相互传递用户信息,效果不显著
----------------------------------------------------------------------------------------------------------------------------
②解决方案2:用户登录成功以后,将用户信息存储到token(令牌),然后写到客户端进行存储
此套方案更加注重于用户信息的存储
说明:用户登录成功后,基于JWT生产一个token,用户信息可以存储到token(令牌)当中。
后续用户访问资源时,直接对token内容解析,检查(检测token中的用户基本信息)登录状态以及权限信息,无需再访问数据库
-------------------------------------------------------------------------------------------------------------------------------
①方案与②方案对比
①方案时基于UUID生成一个token,而②方案是基于JWT技术生产一个token
①方案token与用户信息绑定,用户二次查询的时候,token要去数据库拿数据(多次重复这样的步骤)
②方案用户信息直接放于token中,用户二次访问时,直接对token解析用户数据信息与权限,无需再过数据库
个人看法:②方案更为直接,但是我在考虑一个问题,①方案是token去调用数据库,中间是存在缓冲区的吧,以至于数据不会造成临时丢失之类的问题。不过②方案的更加直观,直接对token中的用户查询信息,考虑的因素多,②方案也无非是最佳的。
========================================================================
1.4单点系统初步设计
1.4.1服务设计
基于单点登录系统中的业务描述,进行初步服务架构设计
其中,服务基于业务进行划分,系统(system)服务只提供基础数据(例如用户信息,日志信息等),认证服务(auth)负责完成用户身份的校验,密码的比对,资源服务(resource)代表一些业务服务(例如我的订单,我的收藏等等)
2.Security 认证流程分析(了解)
目前的登录操作,也就是用户的认证操作,其实现主要基于Spring Security框架,其认证简易
我们来说说Security吧
2.1Spring-Security源码解读
双击Shift显示弹窗搜索
UsernamePasswordAuthenticationFilter 过滤器
该过滤器是yoyong用来处理用户认证逻辑的
我们可以看到下方图片,它其中的默认登录请求url是“login” ,并且只允许POST方式的请求
obtainUsername()方法点进去发现它默认是根据参数名为"username"和"password"来获取用户名和密码的
解析原文只有一部分先来个链接,大家可以去了解一下
Spring-Security源码解读
3.1构建令牌生产及配置对象:
本次借助方案②的JWT(Json Web Token ->是一种json格式)方式将用户相关信息进行组织和加密,并作为响应令牌(Token),从服务端响应到客户端,客户端接受到这个JWT令牌之后,将其保存在客户端,然后携带令牌访问资源服务器,资源服务器获取并解析令牌的合法性,基于解析结果判定是否允许用户访问资源
打个比方:
前提说到,JWT是将用户的信息存储到了Token中,现是将token中的用户信息保存到了客户端。(就如同生活中驾驶证(令牌)一样,当你即将要通过收费站时,交警对你进行检测是否合格进入,如果发现你酒驾或者无照驾驶,则不允许你通过(合法性不合格),如果你是无异常,则允许进入(用户即可访问资源)
3.2定义Oauth2认证授权配置:
①将准备的所有文件(所需要的项目与相关的类)准备好后,开始拼装最后的主体部分,这个主体部分就是授权服务器的核心配置(将所有的配置拼接成最后的主体)
(所有的代码去这)---> 拼装主体需要的代码