Strapi媒体库创作者权限问题:仅查看自身上传内容失效
Strapi媒体库实现作者仅查看自身上传文件的解决方案
直接修改数据库表admin_permissions和admin_permissions_role_links不是官方推荐的方式,不仅容易出错,重启后还可能被系统覆盖。以下是稳定可行的实现方案:
自定义媒体库查询逻辑
在项目的./src/api/upload/controllers/upload.js文件中(无则新建),重写查询方法,让普通作者只能看到自己上传的文件:'use strict'; const { createCoreController } = require('@strapi/strapi').factories; module.exports = createCoreController('api::upload.upload', ({ strapi }) => ({ // 重写列表查询 async find(ctx) { // 超级管理员不受限制 if (ctx.state.user.role.name === 'Super Admin') { return super.find(ctx); } // 给普通作者添加上传者过滤条件 ctx.query.filters = { ...ctx.query.filters, uploadedBy: ctx.state.user.id }; return super.find(ctx); }, // 重写单个文件查询,防止通过ID直接访问他人文件 async findOne(ctx) { const entity = await super.findOne(ctx); if (ctx.state.user.role.name !== 'Super Admin' && entity.data.attributes.uploadedBy.id !== ctx.state.user.id) { return ctx.forbidden('无权访问此文件'); } return entity; } }));给媒体文件关联上传用户
Strapi默认的Upload模型没有关联用户字段,需要修改./src/api/upload/models/upload.js添加关联:'use strict'; module.exports = { attributes: { // 保留原有属性,新增上传者关联 uploadedBy: { model: 'admin::user', required: false } } };执行
strapi migrate命令更新数据库结构。自动绑定上传者信息
在上传文件时自动把当前用户ID存入关联字段,继续在upload.js控制器中添加create方法重写:async create(ctx) { ctx.request.body.data = { ...ctx.request.body.data, uploadedBy: ctx.state.user.id }; return super.create(ctx); }配置角色权限
进入Strapi后台的角色管理,给作者角色配置Upload的权限:允许find、findOne、create操作,不要勾选全局的“查看所有”权限(如果有)。验证效果
用作者账号上传文件后,切换另一个作者账号登录,媒体库应只显示自身上传的内容;超级管理员账号可查看所有文件。
内容的提问来源于stack exchange,提问作者Tomas Mezdej
相关产品推荐
相关产品推荐

