[TOC]
## 一、登录
```
http://127.0.0.1:8066
admin/admin
```
## 二、访问后端api需带上token
```
放header方式:
Authorization:Bearer xxx
放参数方式:
http://localhost:9900/api-user/users?access_token=xxx
```
## 三、后端api方法不做认证方式
```yml
zlt:
security:
ignore:
httpUrls: '不想认证拦截的url'
```
## 四、获取当前登录人对象
有以下两种方式选择
### 4.1. 注解获取
在 `controller` 层请求的方法参数 `SysUser` 上添加 `@LoginUser` 注解,则注入当前登录人信息。
```java
//例1:只有id、username 和 roles
public void test(@LoginUser SysUser user)
//例2:能获取SysUser对象的所有信息
public void test(@LoginUser(isFull = true) SysUser user)
```
### 4.2. 方法获取
在被 `access_token` 鉴权过的请求的任意层任意方法中使用 `LoginUserContextHolder.getUser` 方式获取。
```java
SysUser user = LoginUserContextHolder.getUser()
```
>[warning] 无论在 contoller、service 或者 dao 层使用该方法都可以,需要服务满足以下两个条件:
> 1. 服务依赖 zlt-common-spring-boot-starter
> 2. 请求的入口方法需要鉴权
## 五、获取当前登录的租户
* 请求的方法参数上添加 @LoginClient 注解,则注入租户id信息
```java
//例子:
public void test(@LoginClien String clientId)
```
## 六、认证token类型切换
* 本项目token类型支持3种方式:`db`、`redis`、`jwt`
* 其中因为jwt使用的是非对称加密,所以认证服务(zlt-uaa)需要配置为`authJwt`为私钥加密,其他服务(例如网关)配置为`resJwt`为公钥解密;
* 通过修改`zlt.oauth2.token.store.type`变量即可改变

* 例如现在为jwt方式,需要修改为redis方式,只修改`zlt-uaa`和`zuul-gateway`或者`sc-gateway`的`zlt.oauth2.token.store.type`变量为`redis`即可
## 七、无网络隔离的系统环境下认证修改
* 因为当前的代码是api网关统一认证的架构,适配有网络隔离的环境下使用
* 而如果无网络隔离的环境下代码需求进行调整,将api网关的认证相关内容移去各个微服务里,架构可参考 [无网络隔离认证设计](https://www.kancloud.cn/zlt2000/microservices-platform/1153640)

具体步骤:
### 7.1. 把一下内容从api网关移去各个微服务里:
* `zlt-auth-client-spring-boot-starter` jar包依赖
* `ResourceServerConfiguration` 资源服务配置
* 删除`UserInfoHeaderFilter`类
* 配置文件里面认证相关配置

* `pubkey.txt`公钥
### 7.2. 修改`TokenArgumentResolver`类
改为通过SecurityContextHolder获取用户信息

## 八、token自动续签
* 目前续签功能只支持`redis token`模式,请先确保授权服务器和认证服务器的`zlt.oauth2.token.store.type=redis`
* **认证服务器**开启自动续签功能`zlt.security.auth.renew.enable=true`
* 白名单与黑名单功能是**非必填项**,不配置默认所有应用的token都会续签

>[info]自动续签原理:[系统设计-认证设计-token自动续签设计](https://www.kancloud.cn/zlt2000/microservices-platform/1165104)
## 九、url级权限
该功能默认关闭,开启需要在网关添加url权限相关配置

### 9.1. 打开网关认证配置
`zlt.security.auth.urlPermission.enable`设置为`true`
### 9.2. 配置只认证登录,登录后所有角色都能访问的url(可选项)
`zlt.security.auth.urlPermission.ignoreUrls`
### 9.3. 配置白名单/黑名单(可选项)
`zlt.security.auth.urlPermission.includeClientIds`
`zlt.security.auth.urlPermission.exclusiveClientIds`
详情查看:[url级权限控制](https://www.kancloud.cn/zlt2000/microservices-platform/1202397)
## 十、登录同应用同账号互踢
实现了在同一个应用id下,不同的浏览器使用相同的用户名登录,相互互踢。
在 `zlt-uaa` 中通过参数 `isSingleLogin` 来配置是否开启功能,默认为 `false` 为可以同时登录,改为 `true` 则会互踢
```yaml
zlt:
security:
auth:
isSingleLogin: true
```
## 十一、单点登录与单点登出
在 `zlt-uaa` 工程中通过参数 `unifiedLogout` 来配置是否开启单点登出功能,默认为 `false`
```yaml
zlt:
security:
auth:
unifiedLogout: true
```
### 11.1. demo样例
- **zlt-demo\ss-sso**:使用springSecurity来实现自动单点登录,非前后端分离
- **zlt-demo\web-sso**:前后端分离的单点登录与单点登出
- **zlt-demo\oidc-sso**:拥有独立用户体系的系统,使用OIDC协议的单点登录与单点登出
### 11.2. 相关文章
- [单点登录详解](https://www.kancloud.cn/zlt2000/microservices-platform/2278849)
- [前后端分离的单点登录](https://www.kancloud.cn/zlt2000/microservices-platform/2278850)
- [OIDC协议单点登录](https://www.kancloud.cn/zlt2000/microservices-platform/2278851)
- [单点登出详解](https://www.kancloud.cn/zlt2000/microservices-platform/2539642)
## 十二、手动token鉴权工具
`zlt-auth-client-spring-boot-starter` 依赖只会对 `http` 请求进行拦截鉴权。
对于其他协议如 `webSocket`、`dubbo`、`MQ`等如果需要进行 token 鉴权,可手动使用以下方法:
```java
SysUser user = AuthUtils.checkAccessToken(String accessTokenValue)
```
## 十三、数据权限
在服务的 `application.yml` 配置中添加以下内容:
```yml
zlt:
datascope:
# 开启数据权限,默认为 false
enabled: true
```
详细说明请看:[数据权限](https://www.kancloud.cn/zlt2000/microservices-platform/2278849)
- 项目介绍
- 项目声明
- 项目简介
- 核心功能
- 运行环境
- 项目更新日志
- 文档更新日志
- F&Q
- 部署教程
- 环境准备
- 必要启动模块
- 扩展模块(可选)
- 打包工程
- 开发说明
- 登录认证
- 基础功能
- 分布式功能
- Spring Boot自定义配置自动提示
- 如何新增一个服务
- 自定义配置参数清单
- 公共配置
- 授权认证中心
- 日志中心
- 搜索中心
- 文件中心
- 核心接口
- 密码模式授权
- 授权码模式授权
- 简化模式授权
- 客户端模式授权
- 手动刷新token
- 用户名+密码+验证码授权
- openId授权
- 手机号+密码授权
- 账号登出接口
- 检查token有效性
- OIDC模式授权
- 获取JWT公钥
- 系统设计
- 企业级微服务总体分层架构图
- 企业级服务认证架构设计
- 有网络隔离
- 无网络隔离V1
- 无网络隔离V2
- token自动续签设计(Redis Token)
- url级权限控制
- 多用户类型扩展
- WebSocket接口鉴权
- 授权参数加密
- 兼容旧的密码加密方式
- 数据权限
- 企业级日志解决方案设计
- 企业级监控架构设计(Metrics)
- 框架技术选型
- 架构设计方法论思维导图
- 系统幂等性设计与实践
- 分布式ID生成器解决方案
- 实时搜索系统设计
- 企业级功能
- alibaba/nacos注册中心
- 介绍与相关资料
- 设计模型
- 部署
- 配置中心
- 服务注册发现
- 生产部署方案
- 通过Nginx来实现环境隔离
- 统一日志中心详解
- 介绍与相关资料
- docker安装部署
- 安装包部署(6.x版本)
- elasticsearch 6.x
- logstash 6.x
- kibana 6.x
- 安装包部署(7.x版本+xpack)
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- Filebeat安装部署
- ES索引管理
- 定时任务定期删除
- Index Lifecycle Management
- 没数据问题排查思路
- Logstash
- Grok语法调试
- Grok常用表达式
- 配置语法中的条件判断
- ELK自身各组件监控
- ELK多租户方案
- 慢查询sql详解
- 审计日志-elk详解
- alibaba/sentinel限流熔断
- 介绍与相关资料
- 使用示范
- 动态规则扩展
- 生产应用
- 网关流控
- JWT的RSA非对称密钥生成
- Docker
- 安装(外网)
- 安装(内网)
- 构建项目镜像(免Dockerfile文件)
- APM监控-SkyWalking
- 介绍与相关资料
- APM系统简单对比(zipkin,pinpoint和skywalking)
- server安装部署
- agent安装
- 日志信息清理
- Metrics监控
- 介绍与相关资料
- 安装部署
- 各组件监控
- Grafana仪表盘模板下载
- Grafana告警配置
- 分布式事务
- 基础概念和理论
- TX-LCN(同步场景)
- SEATA(同步场景)(v1.3)
- RocketMQ(异步场景)
- MySQL
- 主从复制
- 主从切换
- 主主复制
- 高可用方案
- Redis
- 单机
- 主从复制
- 主从复制+哨兵
- cluster集群
- 持久化方案
- 数据库之分库分表
- 分库分表思路
- 分库分表部署上线方式
- ShardingSphere配置
- 消息队列
- 消息队列对比参照表
- Spring-Cloud-Stream消息框架
- RocketMQ
- 介绍与相关资料
- 安装部署
- 常见异常处理
- RocketMQ事务消息原理
- Kafka
- 介绍与相关资料
- 应用场景
- 安装部署
- 集群部署
- Kafka Connect
- 分布式文件系统
- FastDFS
- 介绍与相关资料
- 特性详解
- 文件系统的对比
- 安装部署
- MinIO
- Canal数据库日志解析消费
- 介绍与相关资料
- 安装部署
- 高可用架构部署
- 实时同步数据到ElasticSearch
- 全量同步数据到ElasticSearch
- 多租户(应用隔离)
- 技术介绍与隔离方案
- 本项目实现详解
- 分布式日志链路跟踪
- 单点登录
- 单点登录详解
- 前后端分离的单点登录
- OIDC协议单点登录
- 单点登出详解
- Zookeeper集群搭建
- Spring
- 升级 Spring Boot 2.5 与 Spring Cloud 2020 注意要点
- 企业开发环境搭建
- 研发项目管理软件(禅道)
- Maven私服
- 安装部署
- 使用介绍
- Docker私有镜像仓库
- 安装部署
- 使用介绍
- 容器管理平台
- 介绍与相关资料
- 安装部署
- 使用介绍
- 持续集成部署CICD
- 持续交付的含义
- 影响持续交付的因素
- 代码分支策略选择
- CICD流程设计
- 代码仓库Gitlab
- 安装部署
- 免密访问
- webhook配置
- 自动化部署Jenkins
- 安装部署
- ssh免密登录
- 流水线简单例子
- 流水线参数化构建例子
- 静态代码测试SonarQube
- 应用性能
- 压力测试工具
- 介绍和安装
- 使用介绍
- JVM
- JVM性能调优
- 常见JVM内存错误及解决方案
- JVM 分析工具详解
- Spring Cloud性能调优
- Elasticsearch性能优化
- 我的GitChat
- Spring Boot集成Elasticsearch7.x详解
- 微服务统一日志方案ELK7.x落地实战
- Redisson 分布式锁详解与可视化监控方案
- 交流反馈
- 云服务器购买优惠