AzerothCore学习笔记·数据库02:Auth库——守护游戏世界的入口
上篇说了三库分离的整体设计Auth、Characters、World 各管各的事。Auth 库是三库里表最少的但每一张都跟能不能进来有关——表少责任重。先说 account 表这是 Auth 库里最核心的一张表没有之一。字段不多账户名、加密后的密码、邮箱、注册时间、最后登录时间、最后登录的 IP、账户是否被锁定。密码是怎么存的AzerothCore 用的是SRP6Secure Remote Password一种不需要在网络上传输明文密码的认证协议。客户端把密码做一次哈希服务端存的是验证信息而不是密码本身。好处是——即使数据库被拖库攻击者也没法直接拿到明文密码去撞其他网站。这个设计在开源游戏服务端里算是比较讲究的。很多游戏直接用 MD5 存密码被拖库就是灾难。account表里还有一个字段值得注意last_login和last_ip。这不是为了功能是为了安全审计——如果某个账户突然从一个陌生 IP 登录结合logs_ip_actions就可以追踪异常行为。realmlist服务器的黄页realmlist存的是服务器列表。每个区/服在这里有一条记录服务器名称、地址IP 或域名、端口、类型PvE / PvP / RP、时区、当前在线人数、是否在线。玩家选服的时候客户端读的就是这张表。服务端启动的时候也会检查这张表确认自己注册在哪个 Realm ID 下。有个细节realmlist里有一个timezone字段用来标记服务器所在时区。不同地区的服务器会有不同的默认时间偏移影响游戏内事件和每日重置时间。realmcharacters是配套表记录每个账户在各个服务器上有几个角色。这个数据用来限制跨服角色数量也在选服界面显示此账户在该服有 X 个角色。权限和封禁account_access / account_banned / account_muted三张表管三件事。account_access存 GM 权限等级。AzerothCore 的权限是分级的普通玩家是 0GM 有不同等级最高是控制台权限。每个等级能执行的命令不一样比如低等级 GM 只能查背包高等级可以封禁账户。权限可以按 Realm ID 细分——同一个账户在 A 服是 GM在 B 服可能只是普通玩家。account_banned和account_muted分别是封禁和禁言。封禁是彻底进不来禁言是能进来但不能说话。每张表都记录了操作人、原因、开始时间和结束时间——永久封禁的话结束时间是 0。IP 层面的控制ip_banned / logs_ip_actionsip_banned直接在 IP 层面封。支持单个 IP也支持 IP 段CIDR 格式。这个一般用来封批量注册机器人或者 DDoS 来源。logs_ip_actions记录每个 IP 的操作日志什么时候登录了哪个账户、从哪里登录的、有没有触发异常行为。这些数据主要给 GM 做安全审计用不是实时风控是事后追溯。双因素认证secret_digestsecret_digest存 TOTPTime-based One-Time Password的密钥摘要。如果账户开启了双因素认证登录时除了密码还需要一个动态验证码Google Authenticator 之类的 App 生成。密钥存在这张表里服务端用它来验证用户输入的 6 位动态码。这个功能在独立开发者中用得不多但在企业内网部署 AzerothCore 的场景下很有价值——多一层认证少一层风险。自动广播和欢迎消息autobroadcast存服务器自动发的广播消息比如欢迎来到 XX 服“今日活动内容……”。可以配置多条服务器按间隔轮流广播。motdMessage of the Day是玩家登录后第一时间看到的欢迎消息一般用来发公告、维护通知、活动信息。这两张表都是纯内容管理没有复杂的逻辑但很实用——一个服的性格往往从这两条消息里就能看出来。版本控制build_infobuild_info存允许登录的客户端版本号。暴雪每次发补丁客户端版本号会变。服务端可以在这张表里配置只允许哪些版本号连进来。版本不对的客户端直接拒绝连接连登录界面都进不来。这个设计主要是为了防止旧版本客户端触发服务端 bug或者利用版本差异做作弊。运行时间和日志uptime记录认证服务器的启动时间和累计运行时长。这个数据主要给运维用也可以用来计算服务器的可用性指标。logs和logs_ip_actions是 Auth 库里的两张日志表一个管账户级操作一个管 IP 级操作。Auth 库表不多但每一张都在回答同一个问题“你有没有资格进来有什么权限做过什么”。它没有 Characters 库那么热闹背包、任务、邮件天天在变也没有 World 库那么庞大几百张表定义整个世界它就是安安静静守在门口每次登录查一遍然后让服务端去干别的。下篇回到 World 库说模板与实例——那才是 AzerothCore 数据库设计里最有意思的部分。