JHipster技术栈理解 - UAA原理分析
本文简要分析了UAA的认证机制和部分源码功能。
UAA全称User Account and Authentication。
相关源码都是通过Jhipster生成,包括UAA,Gateway,Identity。Jhipster简介请参考这里。
1 OAuth2认证模式
1.1 密码模式
密码模式(Resource Owner Password Credentials)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"认证服务器"进行认证。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。
流程如下:
a, 用户向客户端提供用户名和密码。
b, 客户端将用户名和密码发给认证服务器,向后者请求令牌。
c, 认证服务器确认无误后,向客户端提供访问令牌。
d, 客户端之后所有访问都会传递令牌。
1.2 客户端模式
客户端模式(Client Credentials)指客户端以服务自身的名义,而不是以用户的名义,向"认证服务器"进行认证。
流程如下:
a, 客户端从配置文件或者数据库获取认证信息。
b, 客户端将认证信息发给认证服务器,并请求返回一个访问令牌。
c, 认证服务器确认认证信息无误后,向客户端提供访问令牌。
d, 客户端之后的所有访问不会传递这个令牌。
2 UAA认证方式
2.1 用户调用
oauth2认证模式: 密码模式
配置文件相关内容
oauth2:
web-client-configuration:
#change client secret in production, keep in sync with UAA configuration
client-id: web_app
secret: changeit
时序图
说明:这种认证方式是用在用户访问的场景,也就是服务间调用时总是带着用户名和密码信息。
2.2 机器调用
oauth2认证模式: 密码模式
配置文件相关内容
jhipster:
security:
client-authorization:
client-id: internal
client-secret: internal
时序图
说明:这种认证方式是用在内部服务之间调用的场景,也就是服务间调用时是没有用户名和密码信息的。JHipster生成的UAA是没有这部分的代码的,需要自己实现,参见JHipster技术栈定制 - 基于UAA的微服务之间安全调用
3 源码分析
3.1 UAA
com.yourcompany.uaa.config.UaaConfiguration
注册为认证服务器,注册用户调用客户端(web_app)和机器调用客户端(internal)。目前都是写死的,如果需要保存所有客户端到数据库,需要修改方法configure(ClientDetailsServiceConfigurer clients)。
com.yourcompany.uaa.config.UaaProperties
uaa相关配置属性和值。
com.yourcompany.uaa.config.UaaWebSecurityConfiguration
配置不需要认证的url。
com.yourcompany.uaa.security.DomainUserDetailsService
查询数据库返回包含完整用户信息的对象。
com.yourcompany.uaa.security.IatTokenEnhancer
添加iat到token中,即token创建时间。
com.yourcompany.uaa.security.SecurityUtils
spring security 工具类,获取当前线程用户的登录名,判断当前登录用户是否认证过,判断当前用户是否具有指定的权限。
com.yourcompany.uaa.security.SpringSecurityAuditorAware
获取当前线程用户的登录名,调用SecurityUtils的方法。
com.yourcompany.uaa.security.TokenProvider
创建token工具类。
org.springframework.security.core.userdetails.User
内置用户类,保存用户名,密码,账号是否过期,账号是否锁定,账号凭证是否过期,是否可用。
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
内置过滤器,调用AuthenticationManager校验form表单提交的用户名密码。
org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
内置端点,接受客户端请求,认证后返回token。
org.springframework.security.oauth2.provider.endpoint.TokenKeyEndpoint
内置端点,接受客户端请求,返回验证公钥。
3.2 Gateway
com.yourcompany.gateway.web.filter.RefreshTokenFilter
过滤器,过滤传入的请求并刷新到期之前的访问令牌。
com.yourcompany.gateway.web.filter.RefreshTokenFilterConfigurer
配置类,配置refreshtokenfilter到工程里。
com.yourcompany.gateway.config.MicroserviceSecurityConfiguration
注册为资源服务器,保护/api/和/management/等资源。
com.yourcompany.gateway.config.oauth2.OAuth2AuthenticationConfiguration
注册为oauth2的资源服务器,保护/auth/logout, 注册RefreshTokenFilterConfigurer到应用过滤链中。
com.yourcompany.gateway.config.oauth2.OAuth2JwtAccessTokenConverter
access token解码器,将token解码为身份对象;获取uaa公钥并配置为密钥签名保存在内存中。
com.yourcompany.gateway.config.oauth2.OAuth2Properties
保存配置文件中oauth2部分的属性。
com.yourcompany.gateway.security.AuthoritiesConstants
对应uaa数据表jhi_authority。
com.yourcompany.gateway.security.SecurityUtils
spring security 工具类,获取当前登录用户的登录名,判断当前登录用户是否认证过,判断当前用户是否具有指定的权限。
com.yourcompany.gateway.security.oauth2.CookieTokenExtractor
从cookie中解析出access token,使用了OAuth2CookeiHelper。
com.yourcompany.gateway.security.oauth2.OAuth2CookieHelper
cookie帮助类。 getClaim()方法可以从token中获取明文信息。
com.yourcompany.gateway.security.oauth2.OAuth2AuthenticationService
管理OAuth2的身份验证情况,保存(更新)access token和refresh token的Cookie。
com.yourcompany.gateway.security.oauth2.OAuth2Cookies
保存access token和refresh token。
com.yourcompany.gateway.security.oauth2.CookiesHttpServletRequestWrapper
请求映射器,用于修改原始请求中的cookie。
com.yourcompany.gateway.security.oauth2.CookieCollection
允许修改的Cookie集合,与单纯的数组不同。
com.yourcompany.gateway.security.oauth2.OAuth2SignatureVerifierClient
接口, 定义方法getSignatureVerifier(), 表示创建一个SignatureVerifier,用于获取公钥并验证JWT令牌。
com.yourcompany.gateway.security.oauth2.UaaSignatureVerifierClient
客户端从UAA获取公钥并返回SignatureVerifier。实现了OAuth2SignatureVerifierClient接口的getSignatureVerifier()方法。
com.yourcompany.gateway.security.oauth2.OAuth2TokenEndpointClient
接口, 作为客户端与OAuth2授权服务器的令牌终端通信。2个重要方法: sendPasswordGrant()和sendRefreshGrant()。
com.yourcompany.gateway.security.oauth2.OAuth2TokenEndpointClientAdapter
抽象类, 实现了OAuth2TokenEndpointClient的2个重要方法。定义了一个给请求头中添加身份信息的抽象方法addAuthentication()。
com.yourcompany.gateway.security.oauth2.UaaTokenEndpointClient
继承OAuth2TokenEndpointClientAdapter,实现OAuth2TokenEndpointClient。 作为客户端与UAA服务器的令牌终端通信,实现了addAuthentication()方法,从配置文件中获取如下配置,并放到请求头中:
oauth2:
web-client-configuration:
client-id: web_app
secret: changeit
注意:
- 如果用户登录没有勾选“记住我”,cookie里面的刷新令牌的key为: cookie_token;如果勾选了“记住我”,cookie里面的刷新令牌的key为: refresh_token
- 如果要严格判断登出时间,需要通过缓存中间件保存logout登出信息。
3.3 Identity
com.yourcompany.identity.client.AuthorizedFeignClient
注解。 为机器调用添加认证信息。默认注册拦截器OAuth2FeignRequestInterceptor。
com.yourcompany.identity.client.AuthorizedUserFeignClient
注解。为用户调用添加认证信息。默认注册拦截器UserFeignClientInterceptor
com.yourcompany.identity.client.OAuth2InterceptedFeignConfiguration
注册Oauth2RequestInterceptor。
com.yourcompany.identity.client.OAuth2UserClientFeignConfiguration
注册UserFeignClientInterceptor。
com.yourcompany.identity.client.UserFeignClientInterceptor
拦截器, 给resttemplate的请求头中添加认证信息。
com.yourcompany.identity.config.MicroserviceSecurityConfiguration
注册为资源服务器,保护/api/和/management/等资源。
com.yourcompany.identity.security.oauth2.OAuth2SignatureVerifierClient
接口, 定义方法getSignatureVerifier(), 表示创建一个SignatureVerifier,用于获取公钥并验证JWT令牌。
com.yourcompany.identity.security.oauth2.UaaSignatureVerifierClient
客户端从UAA获取公钥并返回SignatureVerifier。实现了OAuth2SignatureVerifierClient接口的getSignatureVerifier()方法。
JHipster技术栈理解 - UAA原理分析的更多相关文章
- 非对称加密技术- RSA算法数学原理分析
非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...
- jhipster技术栈研究
背景: 公司新的微服务项目都用jhipster脚手架来开发,这篇博客是jhipster里面涉及到技术的汇总目录 一.官方文档中涉及到的技术栈 前端技术栈 Angular / React / Vue R ...
- 【Web技术】276- WebView缓存原理分析和应用
前言 混合式开发,在产品体验以及页面加载速度的体验上已经非比以往的.今日早读文章由@unclechen分享. 正文从这开始- 一.背景 现在的App开发,或多或少都会用到Hybrid模式,到了WebV ...
- JHipster技术栈定制 - 基于UAA的微服务之间安全调用
本文通过代码实例演示如何通过UAA实现微服务之间的安全调用. uaa: 身份认证服务,同时也作为被调用的资源服务.服务端口9999. microservice1: 调用uaa的消费者服务,服务端口80 ...
- [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...
- 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析
零拷贝Zero-Copy 我们先来看下它的定义: "Zero-copy" describes computer operations in which the CPU does n ...
- JHipster技术栈定制 - JHipster Registry消息总线配置
本文说明了如何定制化JHipster-Registry,增加消息总线功能. 实现的效果就是修改配置中心的文件后,通过消息队列主动推送给微服务而无需重启微服务,实现配置内容热加载. 1 整体规划 1.1 ...
- JHipster技术栈定制 - JHipster Registry配置信息加密
本文说明了如何开启和使用JHipster-Registry的加解密功能. 1 整体规划 1.1 名词说明 名词 说明 备注 对称加密 最快速.最简单的一种加密方式,加密(encryption)与解密( ...
- AIDL原理分析
季春初始,天气返暖,新冠渐去,正值学习好时机.在Android系统中,AIDL一直在Framework和应用层上扮演着很重要的角色,今日且将其原理简单分析.(文2020.03.30) 一.开篇介绍 1 ...
随机推荐
- 网站 HTTP 升级 HTTPS 完全配置手册
网站 HTTP 升级 HTTPS 完全配置手册 今天,所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布,详细版本号为v68.0.3440.75,上一个正式版v67.0.3 ...
- .NET MVC扩展UrlHelper支持CDN
0x00.为什么要扩展 因为我的服务器是小水管,加载一个完整的网站往往需要很久,想加速网站加载速度,静态文件最好是分离出来,所有就想到了扩展UrlHelper,用来支持CDN加载文件. 0x01.论引 ...
- Spring AOP实战例子与springmvc整合不起效果的解决办法
在使用AOP之前,首先我们先了解一下什么是AOP吧.在网上很多人将AOP翻译为“面向切面编程”,什么是面向切面?与面向对象有什么区别呢? 在回答这两个问题之前,我们先要明白切面的概念. 切面由切点与增 ...
- 08 训练Tensorflow下围棋
这里介绍一下开源项目Mugo,它基于Tensorflow,可以使用sgf的棋谱训练围棋机器人,跟你下围棋,这里直接给出本人修改完善好的项目,只介绍一下用法. 链接:http://pan.baidu.c ...
- SQL语句方法语法总结(一)
1.distinct:返回不重复.唯一的值. select distinct col_name from tbl_name --表中的col_name 列的值 如果有10条一样的,仅返回一条. 2.w ...
- eclipse导入的项目resource包被当做成文件夹
项目中遇到的问题: 导出的项目(错误) 原本应该是这样的 需要这样设置一下: 1 2 最后就变回来了!
- java 学习基础知识点拾遗 导航页
每种编程语言的知识点都是很多很杂的,java也是如此 相信很多人学习的过程中都是深一脚浅一脚,最基础的东西可能有些也不是非常确定 整理了最基本的一些知识点,可以说是java入门的-1层级别的,作为自己 ...
- webmagic 的 helloworld
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</a ...
- Spring之Bean的生命周期详解
通过前面多个接口的介绍了解了Bean对象生命周期相关的方法,本文就将这些接口的方法串起来,来了解Bean的完整的生命周期.而介绍Bean的生命周期也是面试过程中经常会碰到的一个问题,如果不注意就跳 ...
- 注册asp.net 4.0版本到IIS服务器中
在IIS服务器的运维的过程中,有时候部署asp.net网站发现未安装.net framework对应版本信息,此时就需要重新将.net framework对应的版本注册到IIS中,此处以重新注册.ne ...