Handler, ConnectionHandler & requireSudo
服务端处理类及用于请求处理的 sudo 装饰器。
类
Handler
HTTP 请求处理类,继承自 @hydrooj/framework 的 HandlerOriginal<Context>。新增 domain 属性,并继承框架的全部 handler 工具方法(request、response、args、user、checkPerm、checkPriv、url、renderHTML 等)。这是所有 Hydro HTTP 路由处理器的基类。
| 属性 | 类型 | 说明 |
|---|---|---|
domain | DomainDoc | 当前域文档,在 handler 创建时注入 |
typescript
import { Handler } from 'hydrooj';
class MyHandler extends Handler {
async get() {
const { domain, user } = this;
// domain._id, domain.host, etc.
}
}ConnectionHandler
WebSocket 连接处理类,继承自 @hydrooj/framework 的 ConnectionHandlerOriginal<Context>。新增 domain 属性,并继承框架的 WebSocket 工具方法(send、close 等)。这是所有 Hydro WebSocket 连接处理器的基类。
| 属性 | 类型 | 说明 |
|---|---|---|
domain | DomainDoc | 当前域文档,在 handler 创建时注入 |
typescript
import { ConnectionHandler } from 'hydrooj';
class MyConnection extends ConnectionHandler {
async prepare() {
this.send({ type: 'welcome', domain: this.domain._id });
}
}装饰器
requireSudo
方法装饰器,在执行被装饰的处理方法前强制要求 sudo(重新认证)权限。若用户拥有有效的 sudo 会话(最近一小时内),则正常执行原方法;否则重定向至 sudo 确认页面。
行为:
- 检查
session.sudo时间戳 —— 有效期为 1 小时 - sudo 有效时:恢复已保存的
referer请求头,继续执行原方法 - sudo 缺失或过期时:将请求上下文保存至
session.sudoArgs,重定向至user_sudo页面
typescript
import { Handler, requireSudo } from 'hydrooj';
class AdminHandler extends Handler {
@requireSudo
async post() {
// 此处理器要求用户在过去一小时内
// 通过 sudo 确认页面完成重新认证
}
}备注
Handler和ConnectionHandler均为框架类的重新导出,使用 Hydro 的Context类型参数并新增了domain属性。domain通过handler/create生命周期钩子注入。- 额外的 handler 混入方法(
paginate、limitRate、checkPerm、checkPriv、progress、renderTitle、url、translate)在服务启动时通过server.handlerMixin()注册 —— 参见@hydrooj/framework的HandlerCommon基础接口。 requireSudo专为安全敏感操作设计,防止在共享计算机上利用记住的密码进行误操作。