1.项目中的认证与授权
认证采用了经典的账号密码, 授权采用了oauth2
没有进行支持openID, 而是直接用access_token代替了openID, 因为引入openID,会使系统变得庞大复杂,所以登录与授权融合成了一个接口。
客户端获取授权需要提交oauth2资源的账号密码, 与堃方系统用户的账号密码。
服务器验证成功后,会颁发一个具有时效的oauth2的access_token,客户端每次访问资源时,需要携带access_token,服务器会判断访问的资源是否拥有权限。
2.项目中怎么用?
2.1.外部客户端怎么获取用户?
1. 获取令牌
请求地址 http://网关地址/oauth/token
head参数 Authorization = Basic oauth账号:oauth密码 (账号:密码是用base64加密的)
body参数 username = 用户账号
body参数 password = 用户密码
body参数 grant_type = password (oauth密码验证方式)
.
返回
{
"access_token": "1d3fb4c8-b128-4956-9346-1e7474e4df35",
"token_type": "bearer",
"expires_in": 43175,
"scope": "app"
}
.
2. 客户端将令牌存储起来
目前存储在客户端的cookie中
.
3. 使用令牌
客户端请求可以用下面3种方式携带token请求
head携带 Authorization:Bearer 526d690d-5b7e-4680-94b6-4d6ffad52aab
URL携带 access_token=526d690d-5b7e-4680-94b6-4d6ffad52aab
cookie携带 Cookie:access_token=526d690d-5b7e-4680-94b6-4d6ffad52aab
.
目前文件预览是cookie携带,websocket是URL携带,其他请求是head携带
.
4. 后台返回数据(结束)
2.2.微服务下的api调用链
利用网关统一管理所有服务,(管理要求)所有服务只允许通过网关访问,
执行顺序是 : 客户端 -> 网关 -> 业务模块
kf-zuul: 负责网关(统一控制资源访问权限)
kf-imes-auth: 负责认证授权(控制登录流程)
kf-imes-connect: 负责保存客户端的链接
其他 :业务模块
2.3.微服务之间的关系
2.4.一次登录请求在后台的处理流程
在java标准中, 用户实体被称抽象为身份(Principal),java servlet定义了Principal对象与getUserPrincipal()方法,别的概念(比如oauth,openId)都是具体实现,与javaServlet(j2EE)无关。
1. 客户端调用 http://${kf-zuul}/oauth/token 接口(这个是网关地址)
2. kf-zuul网关服务将所有 oatuh/* 的请求转发到 kf-auth授权服务
3. (认证过程)kf-auth服务 依次执行Spring的Filter过滤器,
过滤器 | 作用 |
---|---|
1.SecurityContextPersistenceFilter | 实现身份持久化. 可以数据库持久,redis持久 |
2.HeaderWriterFilter | 写入http头部字段。比如协议相关的,缓存相关的,安全相关等等 |
3.BasicAuthenticationFilter | 处理请求头字段 Authorization,Basic。 转换为账号密码用ClientDetailsUserDetailsService查oauth_client_details表验证 |
4.SecurityContextHolderAwareRequestFilter | 替换HttpRequest对象,实现从HttpRequest获取当前用户 |
5.AnonymousAuthenticationFilter | 如果到这里,身份还是空的,则给一个身份为anonymousUser的匿名用户 |
6.FilterSecurityInterceptor | 安全授权拦截器, 包装了ProviderManager,ProviderManager里有N个AuthenticationProvider对象, 我们系统用的是DaoAuthenticationProvider,我们在DaoAuthenticationProvider中对请求参数进行了查账号(自定义查库实现)与校验密码(框架实现) |
4. (授权过程)kf-auth服务 执行Spring的Servlet. 此时已经拥有了身份,转到了由spring实现的oauth/token接口控制器,这个接口实现了oauth协议(token的生成,返回数据的格式)
5. 网关收到相应,将结果转发给客户端。
2.5.内部微服务怎么获取用户?
调用下面接口即可
3.项目中怎么配置
3.1.网关的配置(访问权限控制配置,与登录接口配置,与获取用户信息配置)
下图是配置访问逻辑的代码
spring默认实现了以下几个接口(包含登录获取token接口)
下面是获取用户信息配置
3.2.auth服务的配置(编写登录方法,处理登录后的回调)
下图是登录方法
下图是登录回调(登录成功后,登录失败后)