mcenter
用户中心
架构图
项目说明
渐进式微服务组织框架(mvc)
├── protocol # 脚手架功能: rpc / http 功能加载
│ ├── grpc.go
│ └── http.go
├── client # 脚手架功能: grpc 客户端实现
│ ├── client.go
│ └── config.go
├── cmd # 脚手架功能: 处理程序启停参数,加载系统配置文件
│ ├── root.go
│ └── start.go
├── conf # 脚手架功能: 配置文件加载
│ ├── config.go # 配置文件定义
│ ├── load.go # 不同的配置加载方式
│ └── log.go # 日志配置文件
├── dist # 脚手架功能: 构建产物
├── etc # 配置文件
│ ├── xxx.env
│ └── xxx.toml
├── apps # 具体业务场景的领域包
│ ├── all
│ │ |-- grpc.go # 注册所有GRPC服务模块, 暴露给框架GRPC服务器加载, 注意 导入有先后顺序。
│ │ |-- http.go # 注册所有HTTP服务模块, 暴露给框架HTTP服务器加载。
│ │ └── internal.go # 注册所有内部服务模块, 无须对外暴露的服务, 用于内部依赖。
│ ├── book # 具体业务场景领域服务 book
│ │ ├── http # http
│ │ │ ├── book.go # book 服务的http方法实现,请求参数处理、权限处理、数据响应等
│ │ │ └── http.go # 领域模块内的 http 路由处理,向系统层注册http服务
│ │ ├── impl # rpc
│ │ │ ├── book.go # book 服务的rpc方法实现,请求参数处理、权限处理、数据响应等
│ │ │ └── impl.go # 领域模块内的 rpc 服务注册 ,向系统层注册rpc服务
│ │ ├── pb # protobuf 定义
│ │ │ └── book.proto # book proto 定义文件
│ │ ├── app.go # book app 只定义扩展
│ │ ├── book.pb.go # protobuf 生成的文件
│ │ └── book_grpc.pb.go # pb/book.proto 生成方法定义
├── version # 程序版本信息
│ └── version.go
├── README.md
├── main.go # Go程序唯一入口
├── Makefile # make 命令定义
└── go.mod # go mod 依赖定义
快速开发
make脚手架
➜ mcenter git:(master) ✗ make help
dep Get the dependencies
lint Lint Golang files
vet Run go vet
test Run unittests
test-coverage Run tests with coverage
build Local build
linux Linux build
run Run Server
clean Remove previous build
help Display this help screen
- 使用安装依赖的Protobuf库(文件)
# 把依赖的probuf文件复制到/usr/local/include
# 创建protobuf文件目录
$ make -pv /usr/local/include/github.com/infraboard/mcube/pb
# 找到最新的mcube protobuf文件
$ ls `go env GOPATH`/pkg/mod/github.com/infraboard/
# 复制到/usr/local/include
$ cp -rf pb /usr/local/include/github.com/infraboard/mcube/pb
- 添加配置文件(默认读取位置: etc/mcenter.toml)
$ 编辑样例配置文件 etc/mcenter.toml.book
$ mv etc/mcenter.toml.book etc/mcenter.toml
- 启动服务
# 编译protobuf文件, 生成代码
$ make gen
# 如果是MySQL, 执行SQL语句(docs/schema/tables.sql)
$ make init
# 下载项目的依赖
$ make dep
# 运行程序
$ make run
相关文档
- web
- 微服务
- 微服务开发(单体开发)
- 远程调用
- 直接调用
- 作为微服务的开发者,需要提供完整的工具链
- rpc 的客户端
- 基于rpc客户端 封装的中间件系统
- 认证中间件: 提供身份认证和鉴权: rpc/auth/server_auth
- sdk 为restful接口封装的客户端
- cli 命令行工具(给系统集成方)
添加缓存, 加速认证流程
- 提升访问的速度(基于 Redis), GET API速度(LIST API 并没有)
SSO
- 本身API的强化, 需要安全性, 同一用户 Web端 只能登陆一次, 用户侧单点: 用户A从 北京登陆(强制下线), 用户A从上海登陆
- 颁发完 新的Token过后, 把老的Token标记为失效
- 系统单点: 多套系统 使用同一的一套认证流程, 对接统一的认证后端
基于LDAP的登录集成
搭建LDAP Server
执行下面的脚本安装LDAP和Web管理
#!/bin/bash -e
docker run -p 389:389 -p 636:636 --name ldap-service --hostname ldap-service --detach osixia/openldap:1.5.0
docker run -p 6443:443 --name phpldapadmin-service --hostname phpldapadmin-service --link ldap-service:ldap-host --env PHPLDAPADMIN_LDAP_HOSTS=ldap-host --detach osixia/phpldapadmin:0.9.0
echo "Go to: https://localhost:6443/"
echo "Login DN: cn=admin,dc=example,dc=org"
echo "Password: admin"
执行下面命令测试LDAP搜索功能
docker exec ldap-service ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
更详细安装请参考: docker-openldap
创建用户
- 首先创建一个Grou(posixGroup): cn=dev,dc=example,dc=org
Attribute |
New Value |
Group |
test |
GID Number |
500 |
objectClass |
posixGroup |
- 在dev组创建一个用户: cn=old fish,cn=dev,dc=example,dc=org
Attribute |
New Value |
Given Name |
old |
Last name |
fish |
Common Name |
old fish |
User ID |
oldfish |
Email |
oldfish@devcloud.io |
Password |
Password |
objectClass |
inetOrgPerson |
对接LDAP
找一个合适能与LDAP交互的SDK
钉钉登录集成(第三方登录)
对接第三方系统: 看文档 (实现了Oauth2.0协议)
开发一个企业内部应用(钉钉): 用于登录认证的
多因子认证(MFA)
常见的场景:
- 双因子登录时,二次确认(用户名+秘密---->验证码(112200)---->登录成功)
- 危险操作二次验证, 用户要注销自己的账号, 需要再次验证身份的验证(验证码)
如何实现:
- 设计一个双因子认证开关: 那些API 需要开启双因子认证, 和权限中间件是一个逻辑:
- lable.Auth = true (开启认证)
- lable.Permission = true (开启鉴权)
- lable.Code = true (开启验证码验证)
服务端开发:
-
发送验证码(需要用户触发, 用户名密码正确 才触发验证码发送)
-
校验验证码(服务端校验 用户传递过来的验证码是否正确)
-
其他服务 开启校验码校验的中间件(lable.Code)
-
短信通知(notify, 用户通知模块)
-
验证码的颁发和校验(code)
-
权限中间件更新(http_auth 更新)