86e5526a83
- 问题1/3: 绩效考核/培训记录员工姓名可点击跳转员工详情页 - 问题2: 离职证明模板支持自定义+员工端下载 - 问题4(P0): 修复工资填写后数据归零问题 - 问题5: 社保添加员工参保信息列表 - 问题6(P0): 商业保险支持为员工参保 - 问题7(P0): 员工福利支持为员工添加福利 - 问题8: 规章制度支持导入Word文档 - 问题9: 文本模板下载Word增加HTML格式 - 问题10: 模板下载变量替换修复(排除token参数) - 问题11(P0): 电子签署发起时员工下拉框有选项 - 问题12: 新增绩效记录添加考评人选项 - 问题13: 违纪记录添加处罚执行细节 - 问题14: 特殊员工列表添加查看详情按钮和姓名链接 - 问题15: 员工福利汇总正确显示参保人员 - 问题16(P0): 证据链验证修复(递归排序key+自动修复历史哈希)
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
import { Request, Response, NextFunction } from 'express'
|
|
import { verifyAccessToken } from '../lib/jwt'
|
|
|
|
export interface AuthRequest extends Request {
|
|
user?: { id: string; orgId: string; role: string }
|
|
orgId?: string
|
|
}
|
|
|
|
export function authMiddleware(req: AuthRequest, res: Response, next: NextFunction) {
|
|
const authHeader = req.headers.authorization
|
|
let token: string | undefined
|
|
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
token = authHeader.substring(7)
|
|
} else if (typeof req.query.token === 'string') {
|
|
token = req.query.token
|
|
}
|
|
if (!token) {
|
|
return res.status(401).json({ success: false, error: { code: 'UNAUTHORIZED', message: '未提供认证令牌' } })
|
|
}
|
|
const payload = verifyAccessToken(token)
|
|
if (!payload) {
|
|
return res.status(401).json({ success: false, error: { code: 'TOKEN_INVALID', message: '令牌无效或已过期' } })
|
|
}
|
|
req.user = { id: payload.id, orgId: payload.orgId || '', role: payload.role }
|
|
// 非 SUPER_ADMIN 用户必须有 orgId,否则企业端 API 会因 orgId=null 报错
|
|
if (payload.role !== 'SUPER_ADMIN' && !payload.orgId) {
|
|
return res.status(403).json({ success: false, error: { code: 'NO_ORG', message: '该账号未绑定企业' } })
|
|
}
|
|
next()
|
|
}
|
|
|
|
export function orgFilterMiddleware(req: AuthRequest, _res: Response, next: NextFunction) {
|
|
if (req.user) {
|
|
req.orgId = req.user.orgId
|
|
}
|
|
next()
|
|
}
|
|
|
|
/**
|
|
* 平台管理员鉴权中间件,仅允许 SUPER_ADMIN 角色通过
|
|
*/
|
|
export function platformAdminMiddleware(req: AuthRequest, res: Response, next: NextFunction) {
|
|
if (!req.user || req.user.role !== 'SUPER_ADMIN') {
|
|
return res.status(403).json({ success: false, error: { code: 'FORBIDDEN', message: '需要平台管理员权限' } })
|
|
}
|
|
next()
|
|
}
|