在织梦DedeCMS中,自定义表单的权限控制是一个比较常见的需求,因为默认情况下,所有有后台登录权限的用户(除了超级管理员)都可以查看和管理所有的表单数据,这在很多场景下是不安全的。
下面我将从 问题分析、解决方案 和 最佳实践 三个方面来阐述。
问题分析:默认权限机制
我们需要理解织梦自定义表单在后台的默认权限逻辑:
- 数据表:自定义表单的数据通常存储在
dede_diyform和dede_diyformdata这两张表中。dede_diyform:存储表单的结构定义(字段名、类型等)。dede_diyformdata:存储用户提交的具体数据。
- 后台入口:所有表单数据的管理都在 [核心] -> [自定义表单] 菜单下。
- 默认权限:默认情况下,只要一个管理员账号能够登录后台,并且该账号被分配了 “查看自定义表单” 的权限(在“系统”->“系统用户管理”->“权限设置”中),他就能看到 所有 自定义表单里的数据,而无法区分是哪个模块或哪个用户提交的。
默认机制的缺陷:
- 无法按表单隔离:一个网站有“在线报名”和“产品咨询”两个表单,A部门的管理员只想看“在线报名”,B部门只想看“产品咨询”,但默认权限下他们能看到所有数据。
- 无法按用户隔离:一个网站有多个城市分站,每个分站的管理员只能看到自己城市提交的表单数据,默认权限无法实现。
- 安全风险:所有有权限的管理员都能看到所有数据,缺乏精细化的控制。
解决方案:三种实现方法
针对以上问题,主要有三种解决方案,从简单到复杂,各有优劣。
通过“栏目权限”进行简单隔离(推荐尝试)
这个方法利用了织梦自带的“栏目管理”功能,虽然不完美,但实现最简单,适合权限需求不复杂的场景。
原理:将每个自定义表单与一个特定的“单页文档”栏目关联,然后通过限制管理员对栏目的访问权限,来间接限制其对表单数据的访问。
操作步骤:
-
创建栏目:
- 进入后台 [栏目] -> [添加栏目]。
- 选择 “单页文档”。
- 栏目名称:在线报名表单数据”。
- 栏目目录:
baoming。 - 权限选项:勾选“仅允许指定管理员管理”,然后选择你希望有权限的管理员账号。
- 创建成功后,记录下这个栏目的 ID。
-
修改自定义表单模板:
- 进入 [核心] -> [自定义表单],找到你想要控制的表单,点击“修改”。
- 在 “模板设置” 标签页,将 “列表模板(list_xxx.htm)” 和 “发布模板(post_xxx.htm)” 的路径修改为你刚刚创建的栏目目录下。
- 列表模板:
{dede:field name='templet'/}/list_baoming.htm - 发布模板:
{dede:field name='templet'/}/post_baoming.htm
- 列表模板:
- 注意:你需要确保模板文件存在于
/templets/你的模板目录/下。
-
修改后台管理文件(关键步骤):
- 打开织梦后台文件:
/dede/diy_list.php。 - 找到类似
if($action == 'list')的代码块。 - 在查询数据库之前,增加一个权限判断,我们只允许管理ID为1、2、3的管理员访问这个ID为5的表单。
// 在 $diy->GetList($diyid); 这行代码之前添加 if($cuserLogin->getUserID() != 1 && $cuserLogin->getUserID() != 2 && $cuserLogin->getUserID() != 3 && $diyid == 5) { ShowMsg('你没有权限访问此表单!', '-1'); exit(); } - 说明:这里的
$diyid == 5是你要控制的表单ID。$cuserLogin->getUserID()是当前登录管理员的ID,你可以根据需要修改这个判断逻辑。
- 打开织梦后台文件:
优点:
- 实现简单,不需要修改数据库。
- 利用了织梦现有功能,易于理解。
缺点:
- 不够灵活,一个管理员只能被分配到一个表单的权限。
- 需要为每个表单都创建一个栏目,并修改后台文件,比较繁琐。
修改数据库,增加用户关联字段(最灵活)
这是最灵活、最专业的方法,可以直接在数据层面实现权限控制。
原理:在 dede_diyform 表中增加一个字段(如 userlist),用来存储有权限查看该表单的管理员ID列表,然后修改后台列表文件,根据这个列表进行过滤。
操作步骤:
-
修改数据库结构:
- 使用phpMyAdmin等工具,为
dede_diyform表增加一个字段。 - 字段名:
userlist - 类型:
TEXT(或VARCHAR(255)) - 这个字段用来存储有权限的管理员ID,
1,5,8。
- 使用phpMyAdmin等工具,为
-
修改后台管理文件:
- 打开
/dede/diy_list.php。 - 找到生成列表SQL语句的地方,通常是
SELECT * FROM dede_diyform WHERE diyid='$diyid'。 - 修改逻辑,增加权限判断,以下是修改后的关键代码示例:
// 引入用户类 // require_once(DEDEINC.'/memberlogin.class.php'); // 通常已经引入 // 获取当前登录管理员ID $uid = $cuserLogin->getUserID(); // 获取所有表单列表 $sql = "SELECT * FROM dede_diyform ORDER BY diyid DESC"; $dsql->SetQuery($sql); $dsql->Execute(); $diys = array(); while($row = $dsql->GetArray()) { // 检查权限 // 如果userlist字段为空,则所有人可见(或仅超级管理员可见) if(empty($row['userlist'])) { // 这里可以设置一个规则,比如只有超级管理员才能看无权限设置的表单 if($cuserLogin->getUserType() == 'super') { $diys[] = $row; } } else { // 检查当前管理员ID是否在userlist列表中 $allowed_users = explode(',', $row['userlist']); if(in_array($uid, $allowed_users)) { $diys[] = $row; } } } // ... 后续代码使用 $diys 数组来循环显示 ... - 打开
-
修改数据添加/编辑界面:
- 打开
/dede/diy_main.php,在表单编辑界面增加一个文本框,用于输入有权限的管理员ID列表。 - 在保存数据时,将这个文本框的值存入
userlist字段。
- 打开
优点:
- 权限控制非常灵活,可以精确到每个表单和每个管理员。
- 性能较好,直接在数据库层面进行过滤。
缺点:
- 需要手动修改数据库和PHP文件,对新手有一定门槛。
- 需要自己开发管理界面来设置权限,增加了工作量。
使用第三方插件或模块(最省心)
如果你不想修改代码,市面上有很多针对织梦权限管理的第三方插件,其中一些专门提供了自定义表单的权限控制功能。
优点:
- 即插即用:安装后通常在后台有专门的权限设置界面,操作非常简单。
- 功能稳定:成熟的插件通常经过了大量测试,兼容性和稳定性较好。
- 不破坏核心文件:很多插件采用钩子或覆盖模板的方式,避免直接修改织梦核心文件,升级时更方便。
缺点:
- 可能收费:功能强大的优质插件通常是商业化的。
- 安全性风险:如果来源不明,可能包含后门或恶意代码。
- 兼容性问题:可能与特定版本的织梦CMS不兼容。
如何寻找: 在织梦的官方论坛、一些DedeCMS资源网站或淘宝上搜索关键词,如“织梦自定义表单权限插件”、“织梦精细权限管理”等。
最佳实践与建议
-
需求评估:首先明确你的权限需求有多复杂。
- 简单需求(比如就2-3个管理员,分两组看不同表单):方案一 足够。
- 复杂需求(多部门、多城市、精细到每个表单):方案二 是最佳选择,虽然开发成本高,但一劳永逸。
- 追求效率,不想开发:方案三 是首选,但务必选择可靠的开源或商业产品。
-
安全第一:无论采用哪种方案,都要确保后台管理员的账号安全,为不同职责的管理员分配不同的权限,遵循“最小权限原则”。
-
代码备份:在修改任何核心文件(如
diy_list.php)之前,务必备份原始文件,以防出错导致后台无法使用。 -
未来升级:如果你计划未来升级织梦CMS版本,要特别注意你修改过的文件,方案二(修改核心文件)的升级成本最高,方案三(使用插件)次之,方案一(利用栏目)相对影响较小。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 栏目权限 | 简单、快速、利用现有功能 | 不灵活、需为每个表单配置、修改后台文件 | 权限需求简单,表单数量少 |
| 修改数据库 | 最灵活、控制精确、性能好 | 开发成本高、需修改数据库和核心代码、升级麻烦 | 权限需求复杂、追求极致控制的专业开发者 |
| 第三方插件 | 省心省力、界面友好、不破坏核心 | 可能收费、有安全风险、可能不兼容 | 追求效率、不想自己开发、预算允许的商业项目 |
对于大多数用户来说,可以先尝试方案一,如果不能满足需求,再考虑方案二或寻找可靠的方案三。
