token

分布式系统---幂等性设计

 ̄綄美尐妖づ 提交于 2020-04-02 15:00:38
最近做的项目的性能调优中关于幂等设计的一些总结 场景:假设有这样一个方法,包含了一些DB操作,check if existing then update else save. 如果两个线程同时去执行这个方法,并且他们处理的是同一条数据,期望应该是其中一个线程是save,另外一个是update。但是有可能线程的处理时间相当重合,线程A在check的时候,线程B也在check,这时A和B都认为数据不存在,都去save,在 数据库 有unique 约束的情况下其中一个操作会失败,而我们期望的可能是后面一个操作应该update(取决于具体业务)。 这是很典型的多线程问题,check - then do something,在单系统环境中这很容易用线程同步来处理(syncronised). 但是如果是分布式系统,这两个线程在不同的server上面,syncronised 是不会起效的,而且同步往往降低效率,并不是我们想要的。 拥有相同参数的多次请求对系统造成的副作用应该是相同的,这就是幂等性。在这个例子里面就是说保证相同的ID组合只会插入一条数据到DB里面,如果一个请求是save,后续的都应该update这条。在单系统中也可以用幂等的设计来规避使用syncronized,因为那会降低效率。一般情况下数据库就能保证这种幂等性--用unique关键字,以上面的场景为例

微信公众平台开发——微信授权登录(OAuth2.0)

前提是你 提交于 2020-04-01 06:34:11
1、OAuth2.0简介    OAuth (开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。   允许用户 提供一个令牌 , 而不是用户名和密码来访问他们存放在特定服务提供者的数据 。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。   我们这里主要模拟在微信公众号中使用OAuth2.0进行授权,获取用户的基本信息的过程。详细的开发文档可查看微信的官方文档。   微信公众平台开发者文档: http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html 2、获取测试公众账号及其相关配置 1)、公众测试账号获取   访问上面的连接,选择“接口测试号申请”获得直接打开 http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index 通过微信客户端扫码登录即可登录。  

kubernetes 的安全

Deadly 提交于 2020-03-31 15:16:56
kubernetes 的安全 标签(空格分隔): kubernetes系列 一: kubernetes的安全机制 二: kubernetes的权限下发devuser 三: kubernetes的 准入控制 ##一: kubernetes的安全机制 1.1 kubernetes的apiserver Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部 各个组件通信的中介,也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计 的。Kubernetes 使用了认证(Authentication)、鉴权(Authorization)、准入控制(AdmissionControl)三步来保证API Server的安全 1.2 Authentication HTTP Token 认证:通过一个 Token 来识别合法用户 HTTP Token 的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串 - Token 来表达客户的一种方式。Token 是一个很长的很复杂的字符串,每一个 Token 对应一个用户名存储在 API Server 能访 问的文件中。当客户端发起 API 调用请求时,需要在 HTTP Header 里放入 Token HTTP Base 认证:通过

深入浅出让你理解跨域与SSO单点登录原理与技术

Deadly 提交于 2020-03-31 11:12:08
一:SSO体系结构 SSO ​ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。 体系结构 ​ 当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--token;用户再访问别的应用的时候就会将这个token带上,作为自己认证的凭据,应用系统接受到请求之后会把token送到认证系统进行校验,检查token的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了 。 Token(令牌) token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。 当用户第一次登录后,服务器生成一个token并将此token返回给客户端,客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。 以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。 简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名

Shiro安全框架

那年仲夏 提交于 2020-03-31 08:59:31
Shiro简介 Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和 会话管理等功能。 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。其不仅可 以用在JavaSE环境,也可以用在JavaEE环境。 二、Shiro架构图 1.从外部来看Shiro,即从应用程序角度来观察如何使用Shiro完成工作。如 下图: 2.从Shiro内部看Shiro的架构,如下图所示: Subject(org.apache.shiro.subject.Subject) 当前与软 件进行交互的实体(用户,第三方服务,cron job,等 等)的安全特定“视图” SecurityManager :SecurityManager 是 Shiro 架构的 心脏。它基本上是一个“保护伞”对象,协调其管理的组 件 以 确 保 它 们 能 够 一 起 顺 利 的 工 作 类 似 于SpringMVC中的入口 servlet Realms :域 Realms 在 Shiro 和你的应用程序的安全数据之间担当 “桥梁”或“连接器”。当它实际上与安全相关的数据如用 来执行身份验证(登录)及授权(访问控制)的用户帐户交互时, Shiro从一个或多个为应用程序配置的Real中寻找许多这样的东西 Shiro 的环境搭建 使用 shiro 实现登陆的操作 第一步 导包 第二步:书写

nginx集群tomcat,session共享问题

浪尽此生 提交于 2020-03-31 05:21:50
简介 上一篇中,nginx实现了tomcat集群,但是其实集群还有很多问题,比如session共享问题。简单来说就是通过负载均衡之后,用户第一次请求的tomcat和第二次请求的tomcat基本不是同一个,但是你在第一次请求放在session中的值只有一个tomcat才,第二个请求的那个tomcat里面是没有的。这样就出现了用户不停登入的情况。。。 方法一:复制session信息 原理:讲道理,这个方法比较蠢,就是有几个tomcat,就复制几个session,只要有一个tomcat中的session发生变化,其他tomcat中的session跟着复制变化,保证所有用户的session在所有的tomcat中都存在而且相同。这样一来无论用户的请求被分配到哪个tomcat都是无所谓的,因为所有的tomcat中都有他们存放的session。 打个比方:如果tomcat相当于饭店,会话相当于筷子的话,如果每次吃饭都要用自己的筷子,那是不是要把每个饭店都放一双自己的筷子。这就是这个方法的原理。 实现: 1、修改sever.xml文件:将Cluster的注释去掉 这里写图片描述 2、打开自己项目的web.xml(不是tomcat/conf/web.xml),增加distributable。 优点:实现简单,没有什么花里胡哨的操作。如果集群的tomcat不多,而且用户没有那么多的时候可以选择这种方式

b2b2c系统jwt权限源码分享part1

*爱你&永不变心* 提交于 2020-03-30 22:39:03
需求分析 在分享源码之前,先将b2b2c系统中权限模块的需求整理、明确,方便源码的理解。 业务需求 b2b2c电子商务系统中权限主要有三个角色:买家、卖家、平台管理员。 其中卖家角色中又有店员,可以设置店员管理不同的权限(如商品和订单的权限分派给不同的店员),同理平台管理员也需要进行上述精细权限的管理,买家权限相对比较单一。 如果禁用了某个店员或管理员,则这个用户需要立刻被登出,保证数据安全性 技术需求 去中心化 javashop电商系统 采用去中心化、容器化的部署方案,考虑性能及扩展性,鉴权需要采用token的方式,不能采用有中心的session方案 公用能力抽象 b2b2c电商体系中存在三端(买家、卖家、管理端),出于性能、稳定性考虑,这三端在部署上是分离的,体现为买家API、卖家API、管理端API,权限本质上就是拦截这三端的api请求,进行鉴权,这三种角色的鉴权既有通用的逻辑又有个性化的逻辑: 通用:token的生成和解析 个性化:权限数据源不同(SecurityMetadataSource) 具体体现就是角色和权限绑定关系的来源不同:卖家端来自卖家的权限设置,平台的来自管理端的权限设置。 这就要求在架构和代码实现上做的该重用的重用,该分离的分离。 架构思路 Token解析架构思路: 两个接口分别对应token的解析和token的生成 默认实现了一个jwt的实现类

.NET Core .NET标准REST库Refit

梦想的初衷 提交于 2020-03-30 19:02:00
1.简介 Refit 是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库。通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST API返回的数据转化为 POCO(Plain Ordinary C# Object,简单C#对象) to JSON。我们的应用程序通过Refit请求网络,实际上是使用Refit接口层封装请求参数、Header、Url等信息,之后由HttpClient完成后续的请求操作,在服务端返回数据之后,HttpClient将原始的结果交给Refit,后者根据用户的需求对结果进行解析的过程。安装组件命令行: Install-Package refit 代码例子: [Headers("User-Agent: Refit Integration Tests")]//这里因为目标源是GitHubApi,所以一定要加入这个静态请求标头信息,让其这是一个测试请求,不然会返回数据异常。 public interface IGitHubApi { [Get("/users/{user}")] Task<User> GetUser(string user); } public class GitHubApi { public async Task<User> GetUser() { var gitHubApi =

K8s在LinuxONE上搭建 基于RHEL7 操作系统(一)

余生颓废 提交于 2020-03-30 16:45:16
一、介绍 Kubernetes 是当前炙手可热的技术,它已然成为可开源界的PASS管理平台的标准,当下文章对大多数是对X86平台搭建Kubernetes平台,下面笔者进行在LinuxONE上搭建开源的Kubernetes平台。 搭建K8S 平台主流的有两种方法, 第一种是基于二进制的搭建,通过一步一步的搭建可以加深对K8S各个服务的理解。 官方推荐的自动化部署工具 kubeadm 本次使用官方推荐的Kubeadm 的搭建方法, kubedm 把K8S 自身的服务都被K8S自身的pod,除此之外事先的基础服务是用system服务的方式运行。 master节点安装组件: docker、kubelet、kubeadm 基于本地的system服务运行 kube-proxy 是 动态的可被k8s 管理的pod api-server、kube-controller、etcd、 是托guan在pod node节点组件 docker、kubelet 基于本地的system服务运行 kube-proxy 是 动态的可被k8s 管理的pod flannel 是 动态的可被k8s 管理的pod 二、安装 1. 环境 安装的环境可以使用虚拟机也可以使用Lpar,我这是使用的Openstack环境下面的虚拟机。虚拟机的规格为4C10G50G 系统版本 IP地址 主机名 K8s version Red Hat

axios 二次封装

喜你入骨 提交于 2020-03-30 15:49:54
//对axios进行二次封装 import axios from 'axios'; import qs from 'qs'; // 根据环境变量区分接口的默认地址 switch(process.env.NODE_ENV){ case "production": axios.defaults.baseURL = "http://生产环境地址"; break; case "test": axios.defaults.baseURL = "http://测试环境地址"; break; default: axios.defaults.baseURL = "http://开发环境地址" } //设置超时时间和跨域是否允许携带凭证 axios.defaults.time = 10000; axios.defaults.withCreadentials = true ; //设置 请求传递数据的格式 axios.defaults.header['Content-Type'] = 'application/x-www-form-urlencoded'; axios.defaults.transformRequest = data => qs.stringify(data); //设置请求拦截器 //客户端发送请求 - > [请求拦截器] - > 服务器 //TOKEN校验 (JWT)