You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Orchard Core媒体管理:仅编辑自有媒体仍可删除他人媒体问题咨询

媒体库权限配置异常修复方案

复现确认的问题点

  • 通过后台UI给Author角色授予「仅编辑自有媒体」权限后,该角色下的账号仍可删除其他用户上传的媒体内容,不符合权限配置预期
  • 媒体库列表默认不展示各媒体项的所有权归属(上传者)信息,权限排查、内容管理的成本极高,设计不合理

问题根因

这是WordPress类内容管理系统的原生逻辑疏漏,不是配置操作错误:

  • 「仅编辑自有媒体」的权限校验规则默认只挂载在媒体编辑、更新接口上,完全没有覆盖删除、移至回收站、永久删除类的操作接口,属于典型的权限判断遗漏,直接导致越权删除问题
  • 媒体库默认列配置隐藏了「上传者」字段,属于产品默认设计的不合理项,不是系统故障,通过钩子即可调出字段展示

修复操作

如果你是用第三方角色管理插件做的UI权限配置,不用反复调整插件开关了——这类插件都是调用系统原生权限接口,绕不过下面说的逻辑漏洞,直接加代码即可修复。

1. 补全删除操作的所有权校验

将下面的代码加入主题目录下的functions.php文件,或者自定义功能插件中,从权限底层拦截非自有媒体的删除请求:

// 校验媒体删除权限 禁止删除非自有媒体
add_filter('map_meta_cap', function($caps, $cap, $user_id, $args) {
    if (!in_array($cap, ['delete_post', 'delete_attachment'])) return $caps;
    $target_id = $args[0] ?? 0;
    $target = get_post($target_id);
    if ($target && $target->post_type === 'attachment' && (int)$target->post_author !== (int)$user_id) {
        $caps[] = 'do_not_allow';
    }
    return $caps;
}, 10, 4);

2. 媒体库列表展示所有权归属信息

同样在functions.php中加入下面的代码,给媒体列表新增上传者列,直接展示每个媒体的归属人:

// 媒体库列表添加上传者(所有权)列
add_filter('manage_media_columns', function($columns) {
    $columns['media_owner'] = '所有权归属(上传者)';
    return $columns;
});
add_action('manage_media_custom_column', function($col, $post_id) {
    if ($col === 'media_owner') {
        $owner_id = get_post_field('post_author', $post_id);
        $owner = get_userdata($owner_id);
        echo $owner ? esc_html($owner->display_name) : '无归属';
    }
}, 10, 2);

代码添加完成后清空后台缓存,使用Author角色测试账号复测:尝试访问其他用户上传的媒体详情、执行删除操作,确认返回无权限提示;同时检查媒体库列表,确认所有媒体项正常展示归属人信息即可。

内容的提问来源于stack exchange,提问作者user15039632

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:48:22