# open-cloud
**Repository Path**: ziyinjava/open-cloud
## Basic Information
- **Project Name**: open-cloud
- **Description**: 更快、更新、更全面的springcloud微服务解决方案
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: 2.0.0
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 777
- **Created**: 2020-03-25
- **Last Updated**: 2020-12-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 微服务开放平台 2.0.0 更快、更新、更全面
---
#### 简介
搭建基于OAuth2的开放平台、为APP端提供统一接口管控平台、为第三方合作伙伴的业务对接提供授信可控的技术对接平台.
+ 统一API网关、访问鉴权、参数验签、外部调用更安全.
+ 分布式架构,基于服务发现,Fegin(伪RPC)方式内部调用,更便捷.
+ 深度整合SpringCloud+SpringSecurity+Oauth2,更细粒度、灵活的ABAC权限控制.
+ 前后端分离方式开发应用,分工合作更高效!
+ 代码合理封装、简单易懂、
演示地址
默认登录账号:admin 123456
测试登录账号:test 123456
#### 欢迎吐槽
学习交流群:760809808

#### 代码仓库
##### 请随手给个Star! 感谢支持!
代码生成器
服务端源码-码云
服务端源码-Github
前端ui源码
使用手册
jenkins持续集成
nginx部署前端项目
#### 更新日志
v-2.0.0 2019-05-01
1. 升级SpringCloud版本至Greenwich.SR1,SpringBoot 2.1.4.RELEASE
2. 重构项目结构
3. 增加SpringCloudGateway
4. 迁移gateway功能到base服务中
5. 增加MybatisPlus
6. 使用.yml代替.properties
7. 移除generator模块,将提供单独代码生成项目(计划中...)
v-1.0.0 2019-03-18
1. 重构项目结构
2. 重构表结构
3. 重构授权逻辑
4. 提取公共配置,并迁移到Nacos配置中心
5. 优化功能
#### 代码结构
``` lua
open-cloud
├── docs
├── bin -- 执行脚本
├── config -- 公共配置,用于导入到nacos配置中心
├── generator -- mapper生成器
├── sql -- sql文件
├── opencloud-app -- 应用服务模块
├── app-admin -- 运营后台服务(port = 8301)
├── app-auth-demo -- 移动应用用户认证中心(多认证中心演示)(port = 7211)
├── opencloud-common -- 公共类和jar包依赖
├── opencloud-common-core -- 提供微服务相关依赖包、工具类、全局异常解析等...
├── opencloud-common-starter -- SpringBoot自动扫描
├── opencloud-gateway -- 开放API服务模块
├── opencloud-api-gateway -- API开放网关-基于SpringCloudGateway-(port = 8888)
├── opencloud-api-gateway-zuul --(较为稳定推荐使用)API开放网关-基于Zuul-(port = 8888)
├── opencloud-platform -- 平台服务模块
├── opencloud-base-client -- 平台基础服务接口
├── opencloud-base-provider -- 平台基础服务(port = 8233)
├── opencloud-auth-client -- 平台认证服务接口
├── opencloud-auth-provider -- 平台认证服务(port = 8211)
├── opencloud-msg-client -- 消息服务接口
├── opencloud-msg-provider -- 消息服务(port = 8266)
├── opencloud-scheduler-client -- 任务调度接口
├── opencloud-scheduler-provider -- 任务调度服务(port = 8501)
├── opencloud-bpm-client -- 工作流接口
├── opencloud-bpm-provider -- 工作流服务(port = 8255)
```
#### 系统结构图

### 功能预览
#### 数据模型
##### 基础权限模型

##### 网关访问限制模型

#### 快速开始
上手难度:★★★
本项目基于springCloud打造的分布式快速开发框架. 需要了解SpringCloud,SpringBoot开发,分布式原理。
#### 注:Nacos版本选择V0.9.0以下版本. 1.0.0以上版本暂未测试!
1. 准备环境
+ Java1.8
+ 阿里巴巴Nacos服务发现和注册中心 nacos.io
+ Redis
+ RabbitMq (需安装rabbitmq_delayed_message_exchange插件 下载地址)
+ Mysql
+ Maven
+ Nodejs
2. 导入sql脚本
+ docs/sql/oauth2.sql
+ docs/sql/base.sql
+ docs/sql/gateway.sql
+ docs/sql/quartz.sql && scheduler.sql
3. 导入配置中心,Nacos公共配置
+ 访问 http://localhost:8848/nacos/index.html
+ 新建配置
+ 项目目录/docs/config/db.properties > db.properties
+ 项目目录/docs/config/rabbitmq.properties > rabbitmq.properties
+ 项目目录/docs/config/redis.properties > redis.properties
+ 项目目录/docs/config/common.properties > common.properties
如图:

4. 修改主pom.xml
初始化
``` bush
maven clean install
```
本地启动,默认不用修改
``` xml
127.0.0.1:8848
127.0.0.1:8848
```
5. 本地启动(顺序启动)
1. BaseApplication
2. AuthApplication
3. ZuulGatewayApplication(推荐) 或 ApiGatewayApplication
4. AdminApplication
4个服务启动成功后。就可以依赖这些服务进行微服务开发了。
访问 http://localhost:8888
6. 前端启动
```bush
npm install
npm run dev
```
访问 http://localhost:8080
7. 项目打包部署
maven多环境打包
```bush
mvn clean install package -P {dev|test|online}
```
项目启动
```bush
1. ./docs/bin/startup.sh {start|stop|restart|status} open-base-provider.jar
2. ./docs/bin/startup.sh {start|stop|restart|status} open-auth-provider.jar
3. ./docs/bin/startup.sh {start|stop|restart|status} open-admin-provider.jar
4. ./docs/bin/startup.sh {start|stop|restart|status} open-api-gateway.jar
```
#### 集成开发
###
资源服务器Oauth2校验解析token共总结了3种存放和读取方式:
+ 远程校验解析token. 缺点:需创建客户端信息,http方式,性能较差. 构建方法:OpenHelper.buildRemoteTokenServices(OpenCommonProperties properties)
+ jwt校验解析token. 缺点:需提供jwt签名或密钥,生存token过长(cookie有时存放不下),且base64加密无法存放敏感数据,不方便拓展. 构建方法:OpenHelper.buildJwtTokenServices(OpenCommonProperties properties)
+ (建议使用)redis校验解析token. 无需创建任何客户端和密钥,读取性能优,可存放复杂的认证信息. 缺点:必须使用同一个redis DB. 构建方法: OpenHelper.buildRedisTokenServices(RedisConnectionFactory redisConnectionFactory)
1.创建新maven项目
```xml
opencloud-common-starter
com.opencloud
${opencloud.common.version}
```
2.配置 bootstrap.yml
```yaml
server:
port: 8266
spring:
application:
name: ${artifactId}
cloud:
nacos:
config:
namespace: ${config.namespace}
refreshable-dataids: common.properties
server-addr: ${config.server-addr}
shared-dataids: common.properties,db.properties,redis.properties,rabbitmq.properties
discovery:
server-addr: ${discovery.server-addr}
main:
allow-bean-definition-overriding: true
mvc:
throw-exception-if-no-handler-found: true
resources:
add-mappings: false
profiles:
active: ${profile.name}
management:
endpoints:
web:
exposure:
include: refresh,health
opencloud:
swagger2:
description: 平台消息服务
enabled: true
title: 平台消息服务
```
3. 创建MyServiceApplication.java
```java
//开启feign RPC远程调用
@EnableFeignClients
// 开启服务发现
@EnableDiscoveryClient
@SpringBootApplication
public class MyServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MyServiceApplication.class, args);
}
}
```
4.创建ResourceServerConfiguration.java 资源服务配置
```java
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
// 构建redis获取token,这里是为了支持自定义用户信息转换器
resources.tokenServices(OpenHelper.buildRedisTokenServices(redisConnectionFactory));
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.authorizeRequests()
// 内部访问直接放行
.antMatchers("/v1/**").permitAll()
// 只有拥有actuator权限可执行远程端点
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasAnyAuthority(CommonConstants.AUTHORITY_ACTUATOR)
.anyRequest().authenticated()
.and()
//认证鉴权错误处理,为了统一异常处理。每个资源服务器都应该加上。
.exceptionHandling()
.accessDeniedHandler(new OpenAccessDeniedHandler())
.authenticationEntryPoint(new OpenAuthenticationEntryPoint())
.and()
.csrf().disable();
}
}
```
5.启动项目
#### 多认证中心
1. 平台用户认证中心(opencloud-auth-provider)
2. 应用用户认证中心(app-auth-demo)
3. 用户认证中心2 - 用户认证中心2
4. 用户认证中心N - 根据实际应用可创建多个用户中心
针对不同应用的用户数据是单独存储,所以需要建立不同的认证中心提供用户认证。
+ 采用oauth2统一协议,每个APP拥有独立的认证授权中心.
+ 区分用户数据源
+ 共享客户端oauth_client_details信息.
+ 统一方法获取OpenHelper.getUser().认证中心标识-authCenterId.
+ 个性定制,可单独提供手机验证码等方式登陆.
#### 第三方接口调用
### 1.创建应用信息

### 2.配置开发信息

### 3.授权功能,默认必须勾选获取当前登录信息接口

### 4.使用postman测试调用
例:
应用信息生成的
AppId: 1553588629729
AppSecret: 1a616ba3f91141efa1c4f4a1ce725e2c
1. 多认证中心,密码模式
移动应用用户认证中心:localhost:7211/oauth/token
+ 首先配置客户端密码

+ 输入用户username和password

+ 获取用户信息

2. 授权码模式(authorization_code) 需要用户认证
- 获取code
浏览器访问
```
http://localhost:8211/oauth/authorize?response_type=code&client_id=1553588629729&redirect_uri=http://www.baidu.com
```
未登录将进入登录页,输入系统用户登录信息

用户确认授权信息

重定向到回调地址,获得code

- 使用postman通过code获取access_token,

- 使用access_token获取已授权资源

3. 客户端模式(client_credentials)
```
http://localhost:8211/oauth/token?grant_type=client_credentials&client_id=1553588629729&client_secret=1a616ba3f91141efa1c4f4a1ce725e2c
```
- 获取客户端token

- 访问未授权资源提示权限不足!

- 访问已授权资源,正常返回数据(如果授权完,还提示权限不足,由于上次令牌存在缓存信息,重新获取token即可)
