ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ***** # 1. 有状态 VS 无状态 ``` 1-1. 传统架构(有状态) 通常Sessinon Stroe可以是redis 或者 Memcached ``` ![](https://img.kancloud.cn/a8/6c/a86c18715e54ba9322ab8e92afc70bc6_807x471.png) ``` 1-2. 微服务架构(无状态) 无状态模式下服务器端只做解密和校验,不做存储;由客户端(浏览器)做存储 ``` ![](https://img.kancloud.cn/1d/bf/1dbf1a4c0a1daf266982a4c77e2e3b9e_726x435.png) ``` 1-3. 优缺点对比 ``` ![](https://img.kancloud.cn/91/2d/912d0856f2af30ca47740643a3e2310f_799x295.png) # 2. 微服务常用的安全登录方案(认证/授权) ``` 2-1. "处处登录"方案(OAth2.0) 参考: https://www.cnblogs.com/cjsblog/p/10548022.html OAth2.0系列文档: http://ifeve.com/oauth2-tutorial-all/ Spring Cloud Security认证授权示例代码: https://github.com/chengjiansheng/cjs-oauth2-sso-demo.git Keycloak认证授权示例代码: https://www.github.com/eacdy/spring-cloud-yes.git ``` ``` 2-2. 微服务认证方案-[外部无状态,内部有状态方案] ``` ![](https://img.kancloud.cn/e6/26/e6269795aa91f48db9d69e5636e270aa_781x442.png) ``` 2-3. 微服务认证方案-“网关认证授权,内部裸奔”方案 缺点: 网关被攻破,不安全 ``` ![](https://img.kancloud.cn/67/a6/67a6af26890170f4a64208fdab2dc1cd_776x347.png) ``` 2-4. 微服务认证方案-“内部裸奔”改进方案 ``` ![](https://img.kancloud.cn/60/4d/604d90ea34742aaa6be5a795a1264b91_761x447.png) ``` 2-5. 微服务认证方案-方案对比与选择 ``` ![](https://img.kancloud.cn/52/2d/522d23943790247fa51bb7e156625e5a_749x236.png) # 3. 访问控制模型(授权) ``` 即满足什么样的条件,才允许访问 ``` ![](https://img.kancloud.cn/08/69/0869d9f85d46186cf991a6cf4778ce55_527x338.png) ``` 实现RBAC模型,如下: 简单的说,就是为用户分配角色,用角色关联权限 ``` ![](https://img.kancloud.cn/e1/3d/e13d3a785e7d44ff071c578615af4d1b_756x162.png) # 4. JWT是什么?【是什么、组成、上手】 ``` 1. JWT是什么? JWT(JSON Web Token) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式, 用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. ``` ``` 2. JWT组成 Token=Base64(Header).Base64(Payload).Base64(Signature) 如: aaa.bbb.ccc Signature=Header指定的签名算法(Base64(Header).Base64(Payload), 秘钥), HS256("aaa.bbb",秘钥) ``` ![](https://img.kancloud.cn/34/08/3408872fe46dc0e54cbb35580afab478_756x162.png) ``` 开发参考文档: https://www.imooc.com/article/290892 ``` # 5. AOP实现登录状态检查 ``` 1. 过滤器 2. 拦截器 3. Spring AOP ``` # 6. Feign实现Token传递 ``` 1. 单个方法传递在请求参数及调用Feign接口的参数传递 @RequestHeader("X-Token") 2. 统一处理: /** * feign中拦截器传递Token * @FeignClient(configuration = TokenRelayRequestIntecepor.class) */ public class TokenRelayRequestIntecepor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { //1. 获取到Token RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes)requestAttributes; HttpServletRequest request = attributes.getRequest(); String token = request.getHeader("X-Token"); //2. Token传递 if(StringUtils.isNotBlank(token)) { template.header("X-Token", token); } } } ```