[TOC]
# 自定义uaa-client-spring-boot-starter
uaa-client-spring-boot-starter深度扩展spring cloud oauth2/ spring security封装平台通用资源服务能力,进行token 权限校验。其作用是包装资源服务器,作为独立单元为api-gateway,user-center等提供安全保障
## pom依赖

## Spring Security Oauth 认证授权介绍
### 基本设计

### 常用过滤器

* 访问者(Accessor)需要访问某个资源(Resource)是这个场景最原始的需求,但并不是谁都可以访问资源,也不是任何资源都允许任何人来访问,所以中间我们要加入一些检查和防护
* 在访问资源的所经之路上,可能遇到细菌,病毒,不管怎么样,对于要防护的资源来说最好的方法就是设关卡点,对于上图的FilterSecurityInvation,MethodIncation,Jointpoint,这些在spring security oauth中统称SecuredObjects
* 我们知道在哪里设置关卡点最合适,下一步就是设置关卡,对应FileSecurityInterceptor,MethodSecurityInterceptor,AspectSecurityInterceptor,
这些关卡统一的抽象类是AbstractSecurityInterceptor
* 有关卡点,关卡了以后,到底谁该拦截谁不应该呢,spring security oauth中由 AccessDecisionManager控制
* 最后一个问题,这个谁怎么定义,我们总得知道当前这个访问者是谁才能告诉AccessDecisionManager拦截还是放行,在spring security oauth框架中AuthenticationManager将解决访问者身份认证问题,只有确定你在册了,才可以给授权访问。AuthenticationManager,AccessDecisionManager,AbstractSecurityInterceptor属于spring security框架的基础铁三角。
* 有了以上骨架,真正执行防护任务的其实是SecurityFilterChain中定于的一系列Filter,其中ExceptionTranslationFilter,它负责接待或者送客,如果访问者来访,对方没有报上名来,那么,它就会让访客去登记认证(找AuthenticationManager做认证),如果对方报上名了,但认证失败,那么请重新认证送客,送客的方式是抛出相应的Exception,所以名字叫做ExceptionTranslationFilter。
* 最后,这个filter序列中可能不满足我们的需求,比如增加验证码,所以我们需要在其中穿插自己的Filter实现类,为定制和扩展Spring Security Oauth的防护体系。
* spring security内置的filter序列
### 执行过滤链

## 认证授权服务器处理流程

## 授权类处理流程图

## 功能
* 通用资源服务器校验
* 通用的token校验机制(TokenStore)
* 通用的访问控制(OpenAuthorizeConfigManager)
* 通用的异常配置(SecurityHandlerConfig,ExceptionHandlerAdvice)
### 资源服务器
* 要访问资源服务器受保护的资源需要携带令牌(从授权服务器获得)
* 客户端往往同时也是一个资源服务器,各个服务之间的通信(访问需要权限的资源)时需携带访问令牌
* @EnableResourceServer引入OAuth2AuthenticationProcessingFilter过滤器

* 通过继承 ResourceServerConfigurerAdapter 类来配置资源服务器

### ResourceServerSecurityConfigurer 可配置属性
* tokenServices:ResourceServerTokenServices 类的实例,用来实现令牌业务逻辑服务
* resourceId:这个资源服务的ID,这个属性是可选的,但是推荐设置并在授权服务中进行验证
* tokenExtractor 令牌提取器用来提取请求中的令牌
* 请求匹配器,用来设置需要进行保护的资源路径,默认的情况下是受保护资源服务的全部路径
* 受保护资源的访问规则,默认的规则是简单的身份验证(plain authenticated)
* 其他的自定义权限保护规则通过 HttpSecurity 来进行配置
* 使用 DefaultTokenServices 在资源服务器本地配置令牌存储、解码、解析方式
## 核心代码处理逻辑
认证授权核心的逻辑在于票据的生成和验证,认证服务器负责生成票据,资源服务器负载验证票据,二者统一调用DefaultTokenServices服务。

### DefaultTokenServices票据服务
DefaultTokenServices核心服务在于调用TokenStore生成验证token

#### 票据token redis持久化

#### redis token 结构
~~~
排除refresh_token,主要key如下:
* access:token值,value为string,这个主要是通过token值来获取OAuth2AccessToken
* auth:token值,value为string结构,这个主要用来获取token的OAuth2Authentication,用来获取相应的权限信息
* auth_to_access:OAuth2Authentication相关信息加密后的值,value为string结构
这个主要是通过OAuth2Authentication来获取OAuth2AccessToken
* client_id_to_access:clientId,value为list结构
这个主要是存储了每个clientId申请的OAuth2AccessToken的集合方便用来审计和应急处理跟clientId相关的token
* uname_to_access:clientId:userId,value的结构是list,存储OAuth2AccessToken的集合
主要是为了通过clientId,userId来获取OAuth2AccessToken集合,方便用来获取及revoke approval
~~~
#### 票据token jwt存储

## com.open.capacity.uaa.common.UAAClientAutoConfig的作用
* 提供OAuth2AuthenticationProcessingFilter保护我们的API接口
* 提供白名单免除OAuth2AuthenticationProcessingFilter校验API接口
* 提供方法级权限校验
### 资源服务器核心配置

通过以上配置可以达到以下效果
* 不带token http://127.0.0.1:7000/users?page=1&limit=10

* 带不合法token http://127.0.0.1:7000/users?access_token=sds&page=1&limit=10

* 带合法token http://127.0.0.1:7000/users?access_token=a3e3b8b3-5014-4eb5-b62e-6261f8afe4b5&page=1&limit=10

[查看token的生成](10.%E8%87%AA%E5%AE%9A%E4%B9%89uaa-server-spring-boot-starter.md)
### 资源服务器核心权限过滤

### 自定义安全门面设计

### 自定义安全策略

### 白名单配置类

### 白名单配置文件

### websocket安全拦截

### 获取当前登录人

```
@GetMapping("/users/current")
@ApiOperation(value = "根据access_token当前登录用户")
public ResponseEntity<LoginAppUser> getLoginAppUser(@LoginUser(isFull = true) SysUser user) {
return ResponseEntity.succeed(sysUserService.getLoginAppUser(user));
}
```
* 传入token方式可以配合@LoginUser方式获取当前登录人
* 传入userId username role的方式也可以配合@LoginUser方式获取当前登录人
- 01.前言
- 02.快速开始
- 01.maven构建项目
- 02.安装mysql数据库
- 03.安装redis缓存中间件
- 04.快速启动框架
- 03.总体流程
- 01.架构设计图
- 02.oauth接口
- 03.功能介绍
- 04.部署细节
- 04.模块详解
- 01.基础介绍
- 02.自定义db-spring-boot-starter
- 03.自定义log-spring-boot-starter
- 04.自定义redis-spring-boot-starter
- 05.自定义base-spring-boot-starter
- 06.自定义common-spring-boot-starter
- 07.自定义loadbalancer-spring-boot-starter
- 08.自定义swagger-spring-boot-starter
- 09.自定义uaa-client-spring-boot-starter
- 10.自定义uaa-server-spring-boot-starter
- 11.自定义oss-spring-boot-starter
- 12.自定义sentinel-spring-boot-starter
- 05.服务详解
- 01.nacos-server
- 02.auth-server
- 03.user-center
- 04.new-api-gateway
- 05.file-center
- 06.log-center
- 07.back-center
- 08.auth-sso模块
- 09.admin-server
- 10.job-center
- 06.系统安全
- 01.非法字符漏洞攻击
- 02.防重放攻击
- 03.代码审计
- 04.Xray扫洞
- 05.混沌工程质量保证
- 07.生产部署K8S
- 01.基本环境安装
- 02.基本组件安装
- 03.集群验证
- 04.安装Metrics Server
- 05.安装容器平台
- 06.Ingress网关
- 07.metalb负载均衡器
- 08.容器平台集群
- 08.K8S资源练习
- 01.Deployment
- 02.StatefulSet
- 03.DaemonSet
- 04.redis集群服务
- 05.elasticsearch集群
- 06.rocketmq部署
- 09.生产容器化部署
- 01.nacos集群部署
- 02.user-center服务
- 03.auth-server服务
- 04.new-api-gateway服务
- 技术交流