移除自己的系统管理员角色后恢复访问权限

如果你从自己的用户账号中移除了系统管理员角色,或者移除了所有角色,你就会失去对用户、角色以及所有需要系统管理员权限的页面的访问权。大多数情况下,你可以自己恢复访问权限,不需要提交工单。

为什么会发生这种情况

Frappe 会在每个页面上检查你的角色。像用户列表、角色和角色权限管理器这样的页面,只有拥有系统管理员角色的用户才能看到。如果你编辑自己的用户记录并取消勾选系统管理员,或者取消勾选所有角色,那么你接下来打开的页面就是你已经无法看到的页面了。Frappe 不会在你保存一个会把自己锁在外面的更改之前提醒你。

例如,Bluepeak Technologies 的 Ayesha Khan 打开了自己的用户记录,想清理掉一些不再需要的角色,结果把系统管理员也一起取消勾选了。

roles-tab-uncheck-system-manager.png

在 dev16.localhost 上实时截取:Ayesha Khan 的用户表单的角色与权限选项卡,角色列表底部的系统管理员复选框已被清除,表单显示“未保存”。已端到端验证:取消勾选此框并保存会重现锁定问题,该账号的用户列表从 16 行降到 0 行。

她保存后,设置工作区从她的侧边栏消失了。如果她直接打开用户列表,列表加载出来没有任何行。如果她打开一个需要系统管理员权限的页面,比如角色权限管理器,她会看到:

错误

Not permitted to view Role Permission Manager

Administrator 用户是唯一的例外:无论“拥有角色”表中显示什么角色,Frappe 始终授予它所有权限。下面的每个选项都直接或间接地利用这一点来恢复你的访问权限。

自己修复

使用下面第一个适用于你的选项。

另一个用户仍然拥有系统管理员角色

请该用户执行以下操作:

  1. 前往用户列表并打开你的用户记录。
  2. 打开角色与权限选项卡。
  3. 勾选系统管理员。
  4. 点击保存。

注销后重新登录以应用更改。

从 bench 控制台重新添加角色

终端

bench --site yoursite.com console

在 In [1]: 提示符下,运行:

Python

user = frappe.get_doc("User", "your-email@example.com")
user.add_roles("System Manager")

从站点注销并重新登录。

如果你不想动自己的用户记录,也可以改为从命令行创建一个临时的第二个系统管理员用户,然后用它通过界面修复你的主账号:

终端

bench --site yoursite.com add-system-manager temp-admin@example.com \
  --first-name Temp --password "a-strong-password"

通过 SSH 进入 bench 组

SSH 访问需要先创建一个私有的 bench 组并添加你的 SSH 密钥。参见 SSH 访问。一旦你能通过 SSH 登录,运行与选项 2 中相同的 bench --site yoursite.com console 命令和 user.add_roles("System Manager"),然后从你的站点注销并重新登录。

使用数据库访问

前往站点仪表盘 → 操作 → 访问站点数据库,如果你之前没用过,点击启用访问。使用显示的凭据通过 MariaDB 命令行客户端连接,然后运行:

SQL

INSERT INTO `tabHas Role`
  (name, creation, modified, modified_by, owner, docstatus,
   idx, parent, parentfield, parenttype, role)
VALUES
  (UUID(), NOW(), NOW(), 'Administrator', 'Administrator', 0,
   1, 'your-email@example.com', 'roles', 'User', 'System Manager');

通过这种方式所做的更改会跳过 Frappe 的正常保存步骤,因此对已经打开的会话不会生效。从你的站点注销并重新登录,角色才会生效。(已验证:直接在数据库中添加的角色只有在重新登录后才会出现——在那之前,正在运行的会话会一直保留旧的角色列表。)

重置 Administrator 密码

这在自托管环境中有效,或者在 Frappe Cloud 上,只要你像选项 2 或 3 那样拥有控制台或 SSH 访问权限也有效:

终端

bench --site yoursite.com set-admin-password "a-strong-new-password"

使用用户名 Administrator 和你刚设置的密码登录。Administrator 始终拥有完全访问权限,所以你现在可以打开自己的用户记录,并通过正常的角色与权限选项卡重新勾选系统管理员。

user-list-access-restored.png

在 dev16.localhost 上实时截取:Ayesha Khan 账号的系统管理员角色恢复后、她重新登录时的用户列表——列表再次显示全部 16 个用户(锁定期间为 0),右上角的+ 添加按钮也回来了。

如果这些都不适用于你

如果你的站点在共享的 Frappe Cloud bench 上,你没有数据库访问权限、没有其他系统管理员用户,也没有保存的 Administrator 密码,请在 support.frappe.io 上提交工单。支持人员会要求你从 Frappe Cloud 仪表盘(侧边菜单中的访问请求)批准一个站点访问请求,然后他们才能恢复你的角色。

如何预防

  • 在每个站点上保留第二个拥有系统管理员角色的用户,作为常备的备用管理员。如果你把一个账号锁在外面,你可以在不到一分钟内从另一个账号修复它。
  • 在从您自己的用户中移除角色之前,请检查它是否是最后一个系统管理员账户。
  • 创建站点时,请将管理员密码保存在安全的地方。即使其他所有系统管理员账户都不在了,它也是您的备用方案。
  • 用户和权限
  • 权限类型
  • SSH 访问
  • 数据库访问