
后端云原生【免费下载链接】deisDeis v1, the CoreOS and Docker PaaS: Your PaaS. Your Rules.项目地址https://gitcode.com/gh_mirrors/de/deis点击查看免费下载Deis 是一个基于 CoreOS 与 Docker 构建的 PaaS 平台其集群运营离不开对用户体系与认证凭证的精细管理。本文基于官方运营任务文档结合 controller、client、deisctl 等模块源码系统讲解 Deis 的两类用户模型、管理员晋升、注册开关registrationMode以及认证令牌的重新签发帮助你掌握一套可落地、可验证的集群日常运维方案。用户体系概览普通用户与管理员Deis 平台将用户划分为两个类别普通用户normal users可以使用 Deis 的大部分功能——创建和部署应用、添加/移除域名、管理应用配置等管理员administrators拥有普通用户的全部权限此外对所有应用都拥有 owner 级访问权限还能执行跨用户的令牌管理、注册控制等平台级操作。一个重要的规则是在 Deis 安装后创建的第一个用户会自动成为管理员。这意味着首次部署完成后请妥善保管该初始账号的凭证它是你管理整个平台的基础入口。从源码层面看管理员身份的判定基于 Django 用户模型中的is_superuser/is_staff标志。AdminPermsViewSet在授予管理员权限时将两者同时置为True并在撤销时恢复为False参见 controller/api/views.pydef create(self, request, **kwargs): user get_object_or_404(User, usernamerequest.data[username]) user.is_superuser user.is_staff True user.save(update_fields[is_superuser, is_staff]) return Response(statusstatus.HTTP_201_CREATED) def destroy(self, request, **kwargs): user get_object_or_404(User, usernamekwargs[username]) user.is_superuser user.is_staff False user.save(update_fields[is_superuser, is_staff]) return Response(statusstatus.HTTP_204_NO_CONTENT)将普通用户提升为管理员使用deis perms命令即可把用户提升为管理员$ deis perms:create john --admin Adding john to system administrators... done命令的完整语法在 client/parser/perms.go 中有明确定义Usage: deis perms:create username [-a --appapp|--admin] Arguments: username the name of the new user. Options: -a --appapp grants username permission to use app. --admin grants username system administrator privileges.其中--admin与--app是互斥选项前者授予系统管理员权限后者则是把用户添加为某个应用的协作者collaborator。底层的PermCreate逻辑在 client/cmd/perms.go 中分支处理if admin { fmt.Printf(Adding %s to system administrators... , username) err perms.NewAdmin(c, username) } else { fmt.Printf(Adding %s to %s collaborators... , username, appID) err perms.New(c, appID, username) }对应的 API 路径为POST /v1/admin/perms/参见 controller/api/urls.py服务端由AdminPermsViewSet.create完成身份标志的写入。如需撤销管理员权限可使用$ deis perms:delete john --admin也可以使用deis perms:list --admin查看当前所有系统管理员列表参见 client/parser/perms.go。禁用用户注册registrationMode 的三种模式当平台需要限制新用户注册时可以通过deisctl config修改 controller 的注册模式。该配置项存放在 etcd 的/deis/controller/registrationMode键中deisctl 的 config 后端实现见 deisctl/config/etcd/etcd.go。仅允许管理员注册$ deisctl config controller set registrationModeadmin_only完全禁用注册$ deisctl config controller set registrationModedisabled恢复开放注册$ deisctl config controller set registrationModeenabledenabled同时也是默认值——controller 的启动脚本通过etcd_set_default registrationMode enabled为集群初始化该键参见 controller/bin/boot。如果集群是从早期版本升级而来存在/deis/controller/registrationEnabled旧键数据迁移脚本会将其自动转换为新的registrationMode键参见 controller/migrations/data/0002.sh。配置如何生效从 etcd 到 Django 设置deisctl config controller set keyvalue本质上是在 etcd 的/deis/controller/命名空间下写入键值。deisctl 的配置逻辑先把目标拼接为/deis/component/前缀再用正则^(.)([\s\S])$解析keyval参数并写入后端参见 deisctl/config/config.gorootPath : /deis/ target / ... path : root k val, err : valueForPath(path, v) ... ret, err : cb.Set(path, val)controller 容器内的 confd 会把该键渲染进 Django 设置文件{{ if exists /deis/controller/registrationMode }} REGISTRATION_MODE {{ getv /deis/controller/registrationMode }} {{ end }}参见 controller/templates/confd_settings.py随后注册接口由权限类HasRegistrationAuth把关参见 controller/api/permissions.pydef has_permission(self, request, view): try: if settings.REGISTRATION_MODE disabled: raise exceptions.PermissionDenied(Registration is disabled) if settings.REGISTRATION_MODE enabled: return True elif settings.REGISTRATION_MODE admin_only: return request.user.is_superuser else: raise Exception({} is not a valid registation mode .format(settings.REGISTRATION_MODE)) except AttributeError: return True三种模式的最终行为可以归纳为registrationMode行为实现要点enabled任何人均可注册直接返回Trueadmin_only仅管理员is_superuser可注册返回request.user.is_superuserdisabled完全禁止注册抛出PermissionDenied(Registration is disabled)其他任意值拒绝注册并报错抛出异常提示非法的注册模式该逻辑有完整的单元测试覆盖例如REGISTRATION_MODEadmin_only时普通用户注册返回 403、超级用户注册成功REGISTRATION_MODEnot_a_mode时注册失败参见 controller/api/tests/test_auth.py。认证令牌机制token-based HTTP Authenticationcontroller API 采用基于令牌的简单 HTTP 认证方案token-based HTTP Authentication每个用户在其首次注册时会被签发一个认证令牌。令牌认证尤其适合客户端-服务器场景例如桌面端与移动端 CLI 客户端。客户端发出的每个 API 请求都会携带该令牌底层实现在 client/controller/client/http.goreq.Header.Add(Content-Type, application/json) if c.Token ! { req.Header.Add(Authorization, token c.Token) }令牌与用户信息保存在本地配置文件Linux/macOS 下位于$HOME/.deis/Unix 实现见 client/controller/client/home_unix.go写入时以 0600 权限保护参见 client/controller/client/client.go。一旦令牌泄露就必须立即重新签发。Deis 为此提供了三级粒度的令牌重签能力。重新签发认证令牌个体、指定用户与全员场景一用户重签自己的令牌$ deis auth:regenerate Token Regenerated客户端会调用POST /v1/auth/tokens/参见 client/controller/models/auth/auth.go。当重签对象是当前用户自己时客户端还会把返回的新令牌写回本地配置确保后续请求继续可用参见 client/cmd/auth.goif username all false { c.Token token err c.Save() ... }场景二管理员重签指定用户的令牌$ deis auth:regenerate -u test-user这里-u/--username指定目标用户需要管理员权限。其参数定义见 client/parser/auth.goUsage: deis auth:regenerate [options] Options: -u --usernameusername specify user to regenerate. Requires admin privilages. --all regenerate token for every user. Requires admin privilages.场景三管理员重签所有人的令牌集群发生大规模安全事件时可以一次性重签所有用户的令牌$ deis auth:regenerate --alltrue服务端实现与权限校验TokenManagementViewSet.regenerate是这三个场景的服务端入口参见 controller/api/views.pydef regenerate(self, request, **kwargs): obj self.get_object() if all in request.data: for user in User.objects.all(): if not user.is_anonymous(): token Token.objects.get(useruser) token.delete() Token.objects.create(useruser) return Response() if username in request.data: obj get_object_or_404(User, usernamerequest.data[username]) self.check_object_permissions(self.request, obj) token Token.objects.get(userobj) token.delete() token Token.objects.create(userobj) return Response({token: token.key})关键点是all与username两种请求必须由超级用户发起否则请求会被拒绝。该权限由CanRegenerateToken强制参见 controller/api/permissions.pydef has_permission(self, request, view): if username in request.data or all in request.data: return request.user.is_superuser else: return True也就是说不携带任何目标参数时重签自己任何登录用户都允许一旦涉及他人或全员只有is_superuser才能通过。客户端的测试用例也印证了三种请求体的差异——{all:true}与{username:test}以及空请求体重签自己分别对应不同的响应处理参见 client/controller/models/auth/auth_test.go 与TestRegenerate测试。令牌失效后的表现与恢复令牌一旦被重新签发旧令牌立即失效。用户继续使用旧令牌访问 API 时将收到401 UNAUTHORIZED$ deis apps 401 UNAUTHORIZED Detail: Invalid token出现该提示后用户需要重新登录以获取并使用新的认证令牌$ deis auth:login http://deis.example.com登录成功后客户端会获取新令牌并写入本地配置参见 client/cmd/auth.go之后的 API 调用将自动携带新令牌。这一重签令牌 → 旧令牌立即失效 → 重新登录的闭环就是 Deis 在令牌泄露场景下的标准恢复流程。小结一套完整的用户运营清单综合以上内容Deis 集群的用户运营可以沉淀为以下常用操作清单查看/晋升/撤销管理员deis perms:list --admin、deis perms:create user --admin、deis perms:delete user --admin控制注册入口deisctl config controller set registrationModeenabled|admin_only|disabled并通过 confd 渲染到 Django 设置后由HasRegistrationAuth强制执行令牌生命周期管理deis auth:regenerate重签自己、deis auth:regenerate -u user管理员重签指定用户、deis auth:regenerate --alltrue管理员重签全员验证与恢复旧令牌请求返回401 UNAUTHORIZED / Invalid token后引导用户执行deis auth:login重新登录。初次部署时请务必牢记第一个注册的用户自动成为管理员请妥善保护该账号及其令牌一旦发生泄露按上述令牌重签流程及时处置即可将影响面收敛到最小。赞分享后端云原生【免费下载链接】deisDeis v1, the CoreOS and Docker PaaS: Your PaaS. Your Rules.项目地址https://gitcode.com/gh_mirrors/de/deis点击查看免费下载相关推荐Prisma 集群Cluster详解集群注册表、认证机制与 CLI 管理命令实战Prisma 集群Cluster详解集群注册表、认证机制与 CLI 管理命令实战 导读 本文聚焦 Prisma 1.x 中的集群Cluster概念后端数据库GraphQL33-js-concepts完整指南掌握JavaScript开发必备的33个核心概念33 js concepts完整指南掌握JavaScript开发必备的33个核心概念 终极JavaScript学习指南 作为一名JavaScript开在 Instant 中集成 Clerk 认证会话令牌配置、客户端注册与 signInWithIdToken 完整实战指南在 Instant 中集成 Clerk 认证会话令牌配置、客户端注册与 signInWithIdToken 完整实战指南 Instant 是一个面向 AI 编后端数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考