Spring Cloud中如何保证各个微服务之间调用的安全性

2019/7/13 posted in  SpringCloud

SpringBoot自定义错误

@ControllerAdvice 可以处理应用级别的异常,有一些容器级别的错误就处理不了,例如 Filter 中抛出异常,使用@ControllerAdvice 定义的全局异常处理机制就无法处理。
可以增加一个配置类,这个类继承 DefaultErrorAttributes 即可。如果想完全自定义错误机制(指json和html),新建一个controller,继承BasicErrorController即可

2019/7/8 posted in  SpringBoot

Docker重要概念

Docker镜像 (Image)
Docker容器 (Container)
Docker仓库 (Registry)

2019/6/21 posted in  Docker

设计模式总结

面向对象编程几年了,一直没有总结一下设计模式,现在略总结一下。
设计模式其实是一直编程方法和思想,为了是代码的维护性,可扩展性,复用性和灵活性,是前人总结出来的代码最佳实践。
接下里的总结几乎没有代码,是粗略描述各个设计模式使用的思想和场景。

阅读更多   2019/5/31 posted in  设计模式

安装插件

  1. .ignore
  2. Alibaba Java Coding Guidelines alibaba
  3. Mavnen Helper
  4. Translation
  5. Vue.js
  6. Lombok
  7. Rainbow Brackets
  8. Mybatis-log-plugin
  9. mybatisx
2019/5/28 posted in  IntelliJIDEA

dockerfile和docker-compose的区别

docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。
而dockerfile的作用是从无到有的构建镜像。

2019/5/22 posted in  Docker

Public Key Retrieval is not allowed

今天新搭建了一个项目,数据库是用的MySQL 8.0.15,拷贝的原来项目的数据库配置,但是报
Public Key Retrieval is not allowed的错误,只需要在url后面增加&allowPublicKeyRetrieval=true既可解决。
例如:jdbc:mysql://${MYSQL-HOST:localhost}:${MYSQL-PORT:3306}/${MYSQL-DB:dengyuanke}?characterEncoding=utf8&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true

2019/5/13 posted in  MySQL&MariaDB

Spring Security OAuth2

授权模式

从阮一峰的教程中,可以看到授权模式有四种:

  • authorization_code (授权码)
  • implicit (隐式许可)
  • password (用户名和密码)
  • client_credentials (客户端凭证)

OAuth2服务提供方的实现

OAuth2中,有 Authorization Server和Resource Server。通常情况下,我们可以把这两个Server包含在一个应用中。

spring security中, org.springframework.security.oauth2.provider包下都是OAuth2服务提供方的实现所需要的类。

两个核心类,AuthorizationEndpoint的用途是请求者用来获取授权,TokenEndpoint的用途是请求者用来获取Token的。

服务配置过程

EnableAuthorizationServer

EnableAuthorizationServer注解用来配置Authorization Server。

这个注解引入两个配置类AuthorizationServerEndpointsConfiguration和AuthorizationServerSecurityConfiguration。

AuthorizationServerEndpointsConfiguration中初始化了各种endpoint:

其中包括AuthorizationEndpoint,TokenEndpoint,CheckTokenEndpoint,WhitelabelApprovalEndpoint,WhitelabelErrorEndpoint。

从各种endpoint来看,spring security帮我们定义好了如下几个uri对应的服务。

/oauth/authorize:授权

/oauth/token:令牌

/oauth/confirm_access:用户确认授权提交

/oauth/error:授权服务错误信息

/oauth/check_token:用于资源服务访问的令牌解析

/oauth/token_key:提供公有密匙的端点,如果你使用JWT令牌的话

AuthorizationServerSecurityConfiguration引入了配置类ClientDetailsServiceConfiguration和AuthorizationServerEndpointsConfiguration。并且
ClientDetailsServiceConfiguration

EnableResourceServer

EnableResourceServer引入了ResourceServerConfiguration配置

2019/5/9 posted in  SpringCloud

API 最佳实践

初衷

旨在对api规划之初做出约定,使研发成员建立默契,提升研发品质和效率

协议

使用 https 协议最佳

域名、版本

https://api.example.com/v1/... 推荐

https://example.com/api/v1/...

URL 设计

每个API代表一种资源,所以路径中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数
https://api.example.com/v1/zoos
https://api.example.com/v1/users
https://api.example.com/v1/animals

HTTP 方法对应CRUD操作

GET :获取
POST:新建
PUT :更新(客户端提供改变后的完整资源)
PATCH :更新(客户端提供改变部分的属性)
DELETE:删除资源
HEAD :获取资源的元数据。
OPTIONS :获取资源的哪些属性是客户端可以改变的

访问示例

参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID :获取某个指定动物园的信息
PUT /zoos/ID :更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals :列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

过滤、分页

?limit=10 :指定返回10条记录
?offset=10:指定从第10条记录开始返回
?page=2&per_page=100:指定第几页,以及每页的记录数
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
?animal_type_id=1:指定筛选条件

响应状态(或者全局返回200,在响应内容中标记请求的结果状态)

200 OK - [GET]:服务器成功返回用户请求的数据,操作幂等
201 CREATED - [POST/PUT/PATCH]:新建或修改数据成功
202 Accepted - []:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,操作幂等
401 Unauthorized - [
]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [
]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,操作幂等
405 Method Not Allowed - 请求方式不支持
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

响应示例

GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

2019/5/9 posted in  SpringBoot

Docker 安装单机Minio

docker pull minio/minio

在Docker中运行Minio单点模式

docker run -p 9000:9000 -e MINIO_ACCESS_KEY=dengyuanke -e MINIO_SECRET_KEY=dengyuanke minio/minio server /data

阅读更多   2019/4/30 posted in  Docker