项目地址:https://github.com/PassionZale/3Years
如果你曾经使用过类似 wordpress
等开源的系统,不管系统类型是做什么的,它都会有一个安装逻辑,来校验系统的完整度。
通常安装逻辑最主要的三个步骤:
1. 检测服务器环境;
2. 创建数据库;
3. 创建超级管理员账户。
在 3Years 中,我会将前两步都省去,着重来介绍创建超级管理员账户这一步。
超级管理员账户
类似商城的后台用户系统,通常是不开放注册,且 superuser 唯一。创建 superuser
后,由 superuser
去创建普通用户,并为普通用户分配相应的权限。
在 3Years-2 用户模型 中,is_superuser
字段便是用来标识此种账户。由于是前后端分离的架构,那么当客户端访问前端时,系统如何知道 superuser
是否创建了呢?
1. 定义创建超级管理员 API 路由,如: /backend/auth/superuser
;
2. 使用钩子函数拦截整个系统入口,判断 superuser.lock
文件是否存在;
3. superuser.lock
存在则 superuser
已创建,否则统一返回 401
Http Code;
4. 接收到约定好的 401
Code,由前端引导用户至创建管理员账户 router
;
5. 服务端创建 superuser
后,创建 superuser.lock
;
拦截请求
在 CI 中,我们可以在 pre_system
钩子中进行拦截,注意排除掉“创建超级管理员路由”:
此时,访问服务端,会直接抛出 403 superuser is not exist
:
创建超级管理员
写入数据库,并创建 superuser.lock
路由保护区分
你需要将 AUTH 部分和 API 部分相互独立,并用不同的钩子或中间件对请求进行拦截及校验。
在 CI 中,通过控制器二级目录,很容易便能区分路由:
/backend/auth
通过 SystemHook
在 pre_system
钩子中进行拦截:
1. 创建超级管理员;
2. 处理登录,并返回 Authorization Token
。
/backend/api/*
通过 BackendApiHook
在 pre_controller_constructor
钩子中进行拦截:
存放全部资源控制器,只有携带合法 Authorization Token
的请求才可被访问。