Open-Falcon(falcon-plus)Admin Login 接口全解析:基于 Session 的管理员 SSO 登录实现
运维观测指标监控告警【免费下载链接】falcon-plusAn open-source and enterprise-level monitoring system.项目地址https://gitcode.com/gh_mirrors/fa/falcon-plus点击查看免费下载导读本文围绕 Open-Falconfalcon-plus监控系统中 api 模块提供的POST /api/v1/admin/login管理员 SSOSingle Sign-On登录接口展开讲解它的请求/响应格式、Session 鉴权前提、管理员权限校验逻辑并结合源码剖析其在 modules/api/app/controller/uic/session_controller.go 中的真实实现。读完本文你将掌握如何用已有的 Session 令牌换取任意用户含普通用户的登录态、理解role权限模型在接口中的作用并能通过测试用例与配置项完整复现该接口的调用方式。接口总览文档中的核心定义原文档docs/_posts/Admin/2017-12-07-admin_login.md将该接口定义为接口路径POST /api/v1/admin/login接口类型POST用途SSO 登入管理员代登录前置条件需要携带有效的 Session认证会话属于Admin管理能力的使用场景。请求体Request接口只接收一个 JSON 字段——目标用户名例如为名为test2的用户发起登录{ name: test2 }响应体Response成功时返回 HTTPStatus: 200响应 JSON 中包含三个字段{ sig: 9d791331c0ea11e690c5001500c6ca5a, name: test2, admin: false }字段说明字段类型含义sigstring该用户在当前系统中生成的 Session 签名令牌后续所有需鉴权接口通过Apitoken请求头携带namestring被代登录的用户名与请求体中的name一致adminbool该用户是否为管理员由角色role决定详见下文权限模型错误响应遵循统一的 response status codes 文档 约定。路由注册与中间件为什么必须先有 Session在 modules/api/app/controller/uic/user_routes.go 中可以看到该接口的路由注册方式adminapi : r.Group(/api/v1/admin) adminapi.Use(utils.AuthSessionMidd) adminapi.PUT(/change_user_role, ChangeRoleOfUser) adminapi.PUT(/change_user_passwd, AdminChangePassword) adminapi.PUT(/change_user_profile, AdminChangeUserProfile) adminapi.DELETE(/delete_user, AdminUserDelete) adminapi.POST(/login, AdminLogin)关键点在于adminapi.Use(utils.AuthSessionMidd)整个/api/v1/admin路由组都挂在Session 鉴权中间件之下。也就是说调用/api/v1/admin/login之前调用方必须以管理员身份完成一次常规登录拿到自己的sig然后以如下请求头发起本接口Apitoken: {\name\:\root\,\sig\:\427d6803b78311e68afd0242ac130006\}这与普通用户登录接口POST /api/v1/user/loginsession_controller.go形成对照对比项/api/v1/user/login/api/v1/admin/login请求字段namepassword仅name由管理员代发起是否需要 Session否首次登录是需携带管理员Apitoken鉴权模型校验密码哈希校验管理员身份 角色等级中间件如何校验 Session中间件 modules/api/app/utils/auth_middle.go 调用h.SessionChecking从请求头解析Apitoken反序列化为{name, sig}若配置了default_token且sig与之相等直接视为通过用于服务端内部访问否则在 uic 库的user表与session表中核对name与sig的匹配关系session表存在该记录才判定认证成功若配置skip_auth为true则跳过校验仅建议在开发/测试环境开启。核心实现解读AdminLogin 的完整逻辑处理函数位于 modules/api/app/controller/uic/session_controller.go其执行流程如下绑定请求参数APIAdminLoginInput只声明了Name字段并标记binding:required即name为空时直接返回400name is blank。type APIAdminLoginInput struct { Name string json:name form:name binding:required }解析当前调用者身份通过h.GetUser(c)从Apitoken中还原出当前登录用户即发起代登录的管理员。查询目标用户按name在 uic 库中查询被登录用户若user.ID 0表示用户不存在返回no such user。权限等级校验关键安全点case user.Role adminuser.Role: h.JSONR(c, badstatus, API_USER not admin, no permissions can do this) return从代码可以推断被登录用户的role必须小于当前调用者的role否则拒绝操作并返回API_USER not admin, no permissions can do this。这意味着管理员不能通过本接口登录与自己同级或更高级别的账号防止越权。Session 查询与生成在session表中按uid查询目标用户的既有 Session若不存在session.ID 0则生成新的 UUID 作为sig并将过期时间设为当前时间 3600*24*30秒30 天写入数据库。若目标用户已有 Session则直接复用避免重复生成。返回结果响应的sig、name、admin三个字段与文档示例完全一致。resp : struct { Sig string json:sig,omitempty Name string json:name,omitempty Admin bool json:admin }{session.Sig, user.Name, user.IsAdmin()} h.JSONR(c, resp)其中admin字段由 modules/api/app/model/uic/user.go 的IsAdmin()决定func (this User) IsAdmin() bool { if skipAccessControll() { return true } if this.Role 2 || this.Role 1 { return true } return false }即关闭access_control配置时所有用户都算管理员开启后role为1管理员或2超级管理员才返回true。这正是文档示例中test2用户返回admin: false的原因——该用户role小于管理员等级。Session 认证链路回顾/api/v1/admin/login返回的sig就是目标用户的会话令牌后续调用其他需要鉴权的接口时将它放入Apitoken请求头即可整个认证链路为管理员先调用POST /api/v1/user/loginnamepassword获取自己的{name, sig}携带该Apitoken调用POST /api/v1/admin/login传入目标用户名拿到目标用户的{sig, name, admin}此后以目标用户身份访问受保护接口受保护接口通过AuthSessionMidd中间件在user/session表中校验令牌有效性。这与 Auth Session 文档 描述的Apitoken验证方式一致请求头中Apitoken的 JSON 结构为{name:root,sig:...}并建议携带X-Forwarded-For。若 Session 有效GET /api/v1/user/auth_session会返回{message:session is vaild!}。测试用例接口行为的自动化验证仓库自带的 API 测试 modules/api/test/api_test.go 对该接口做了完整验证Convey(Admin login user: POST /admin/login, t, func() { *rr map[string]interface{}{} resp, _ : resty.R(). SetHeader(Content-Type, application/json). SetHeader(Apitoken, api_token). SetBody(map[string]string{ name: test_user_name, }). SetResult(rr). Post(fmt.Sprintf(%s/admin/login, api_v1)) So(resp.StatusCode(), ShouldEqual, 200) So(*rr, ShouldNotBeEmpty) So((*rr)[name], ShouldEqual, test_user_name) })从测试可以看出请求必须携带Apitoken请求头测试中api_token由 root 用户登录后构造格式为{name:root,sig:...}请求体为{name: 目标用户名}断言响应200、响应体非空且name与请求用户名一致。同一测试文件中也通过POST /user/login验证了 root 用户登录返回sig且admin为true可以作为调用本接口前的完整前置流程参考。常见问题与注意事项name字段缺失或为空接口直接返回400错误信息为name is blank。目标用户不存在返回no such user。权限不足若被登录用户role 当前调用者role返回API_USER not admin, no permissions can do this。因此超级管理员role2不能通过该接口登录而管理员role1可以代登录普通用户role0。Session 复用目标用户已有未过期 Session 时直接复用不会重复生成sig因此多次调用同一接口可能返回相同的sig。测试环境便利开关skip_auth为true时中间件不做 Session 校验access_control为false时IsAdmin()恒为true两者都只建议用于开发调试生产环境请保持默认的安全配置。小结POST /api/v1/admin/login是 Open-Falcon api 模块中实现管理员 SSO 代登录的关键接口它在 Session 中间件的保护下仅凭目标用户名即可换取该用户的会话令牌并通过role等级比较确保操作不越权。结合 路由注册、控制器实现、Session 校验逻辑 与 API 测试用例你可以完整复现该接口的调用流程并为基于 Open-Falcon 的二次开发如统一登录门户、用户管理后台提供可靠的接入参考。赞分享运维观测指标监控告警【免费下载链接】falcon-plusAn open-source and enterprise-level monitoring system.项目地址https://gitcode.com/gh_mirrors/fa/falcon-plus点击查看免费下载相关推荐Cua 项目 GitHub WIF 认证的 Fleets 冒烟测试池Terraform 基础设施与每日 CI 验证实战Cua 项目 GitHub WIF 认证的 Fleets 冒烟测试池Terraform 基础设施与每日 CI 验证实战 导读 本文围绕仓库 infra/fle运维观测指标监控告警WebGoat 发布流程实战指南从版本号规范到 Maven 构建、Tag 推送与 GitHub Release 发布WebGoat 发布流程实战指南从版本号规范到 Maven 构建、Tag 推送与 GitHub Release 发布 导读 本文以 WebGoat 仓库根目录运维观测指标监控告警Notepad--跨平台轻量级文本编辑器的 6 个实战场景Notepad 跨平台轻量级文本编辑器的 6 个实战场景 你大概也有过这种时刻改一个 nginx.conf、翻一段服务器日志、对比两份配置却不想为此打开一运维观测指标监控告警上一篇终极Nintendo Switch自定义固件Atmosphere大气层系统深度解析下一篇Windows Defender彻底卸载工具释放系统性能的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考