目录
一、背景
二、需求
三、方案
1、安全架构选型
2、会话管理
2.1、会话选型
2.2、Session 登录流程
2.3、Token 登录流程
2.4、jwt 框架选型
2.5、会话超时
3、SSO 支持
4、UI设计
5、接口设计
6、数据库表设计
6.1、user表
6.2、roles表
7、Filter 拦截请求
8、配置开关
9、传输通道
微服务实战
Spring家族及微服务系列文章
随着 Nacos 在生产使用,用户要求权限管理机制。考虑到做完整的账号权限管理机制,需要比较大的代价。因此先做⼀个管理员账号的登录管理,从而降低安全风险。
1. 支持定制启用或不启用登录系统,默认启动登录功能(有人自己做控制台,不想启用登录能力)
2. SSO 支持 LDAP 即可(通过扩展机制)
3. 用户退出
目前开源框架主要有 Spring Security 和 Apache Shiro,下面进行⼀下简单对比。
由于 Nacos 本身就是⼀个 spring-boot 的项目,为了更好的能适应外部的多种 sso 需求,和更细粒度的权限控制台能力,选择 spring security。
Spring Security(推荐) Apache Shiro 易用性 简单够用 略复杂强大 sso 支持情况 LDAP SMAL Oauth only SMAL 权限控制粒度 粗 细 三方依赖 无 Spring 社区活跃度 高 低
登录流程现在主要有两种模式,⼀种是 session 模式,⼀种是 jwt 模式。为了更好的解决多端(移动端等)和分布式会话保持,采用 jwt 模式。
session 模式 token 模式(推荐) 分布式回话保持 默认换⼀个机器就没了,如果具备分
布式,需要把 session 放到 redis 中天生具备分布式能力,因为身份直接
放到 token 里面了后端实现成本 简单 复杂,需要依赖 jwt 的组件搞,扩展
之前 sso 实现成本也比较高前端实现成本 高,目前采用 reactive,都在⼀个页
面,无法做拦截跳转简单
目前看 jjwt 框架的 star 和 commiter 比较多:
http://andaily.com/blog/?p=956
会话默认 30 分钟超时,暂时不可配置。
目前仅支持 LDAP,后续让社区贡献,如 SMAL。
登录成功之后,右上角显示登录用户名,和退出按钮。 点击退出,这个 session 失效。
接口描述 接口 url(暂定) 接口操作类型 参数 登录接口 /auth/login POST username=xx&password=xx
form 格式退出接口 /auth/logout GET 无
数据列 类型 是否必填 备注 username varchar(50) 是 用户名 password varchar(500) 是 密码,采用 BCrypt 加密算法存储 enabled boolean 是 是否启用
数据列 类型 是否必填 备注 username varchar(50) 是 用户名 role varchar(50) 是 角色
目前发 sso 的时候我们 console server 都跑在⼀个进程里面。调用的接口都是 naming/config的 openapi。 这些接口登录 filter 是不能拦截的,因为拦截需要登录,会影响 server 调用。 不拦截,控制台的数据请求又拦截不了,登录请求也控制不了。
关于这个问题,我有三个方案:
方案 具体方案 备注 区分 ajax 请求做不同处理 拦截只控制前端 ajax 请求的
登录目前采用 spring-security 框
架不能做到这个特殊逻辑控制console 接口全部代理 控制台这层要走 filter 的服
务,未来都要走 console 的
controller 转发⼀下,以便统
⼀处理改这个成本比价高 console 接口部分代理(推荐) 只把配置列表
服务列表
这种高频先整个控制台管控这是折中方案,未来要走全部
代理方案,以便可分可合
默认开启登录功能,可配置不开启登录功能,以便部分企业研发自己控制台,使用我们 console的 openapi。
登录目前大部分都是 https,nacos 默认不支持 https,如果需要使用 https 功能,在 nacos 前面配置 nginx,nginx 上做 443 端口转后端 8848 端口,nginx 上管理证书。
✨【微服务】SpringCloud的OpenFeign与Ribbon配置
✨集Oauth2+Jwt实现单点登录
✨Spring Cloud Alibaba微服务第29章之Rancher
✨Spring Cloud Alibaba微服务第27章之Jenkins
✨Spring Cloud Alibaba微服务第24章之Docker部署
✨Spring Cloud Alibaba微服务第23章之Oauth2授权码模式
✨Spring Cloud Alibaba微服务第22章之Oauth2
✨Spring Cloud Alibaba微服务第21章之分布式事务
✨Spring Cloud Alibaba微服务第18章之消息服务
✨Spring Cloud Alibaba微服务第16章之服务容错
✨Spring Cloud Alibaba微服务第14章之分库分表
✨Spring Cloud Alibaba微服务第11章之MyBatis-plus
✨Spring Cloud Alibaba微服务第8章之OpenFeign
✨Spring Cloud Alibaba微服务第7章之负载均衡Ribbon
✨SpringCloud Alibaba微服务第6章之Gateway
✨SpringCloud Alibaba微服务第4章之Nacos
✨SpringCloud Alibaba微服务开篇
✨【Spring】一文带你吃透IOC容器技术
✨【微服务】SpringCloud中OpenFeign请求处理及负载均衡流程
✨【微服务】SpringCloud中Ribbon的WeightedResponseTimeRule策略
✨【微服务】SpringCloud中Ribbon的轮询(RoundRobinRule)与重试(RetryRule)策略
✨【微服务】SpringCloud中Ribbon集成Eureka实现负载均衡
✨【微服务】SpringCloud轮询拉取注册表及服务发现源码解析
✨【微服务】SpringCloud微服务续约源码解析
✨【微服务】SpringCloud微服务注册源码解析
✨【微服务】Nacos2.x服务发现?RPC调用?重试机制?
✨【微服务】Nacos通知客户端服务变更以及重试机制
✨【微服务】Nacos服务发现源码分析
✨【微服务】SpringBoot监听器机制以及在Nacos中的应用
✨【微服务】Nacos服务端完成微服务注册以及健康检查流程
✨【微服务】Nacos客户端微服务注册原理流程
✨【微服务】SpringCloud中使用Ribbon实现负载均衡的原理
✨【微服务】SpringBoot启动流程注册FeignClient
✨【微服务】SpringBoot启动流程初始化OpenFeign的入口
✨Spring Bean的生命周期
✨Spring事务原理
✨SpringBoot自动装配原理机制及过程
✨SpringBoot获取处理器流程
✨SpringBoot中处理器映射关系注册流程
✨Spring5.x中Bean初始化流程
✨Spring中Bean定义的注册流程
✨Spring的处理器映射器与适配器的架构设计
✨SpringMVC执行流程图解及源码