使用DedeCMS内置的 {dede:php} 标签(推荐,最简单)
这种方法的核心思想是:在栏目的列表页模板(list_*.htm)中,使用 {dede:php} 标签编写PHP代码,在页面加载时检查用户是否登录,如果未登录,则直接跳转到登录页面。

优点:
- 无需修改核心文件,升级DedeCMS时不易丢失。
- 实现简单,直接在模板文件中操作。
缺点:
- 如果用户直接访问内容页(
article_*.htm),此方法无效,因为内容页模板是独立的。
操作步骤:
-
找到栏目列表页模板 登录你的DedeCMS后台,进入【模板】->【默认模板管理】。 找到你想要设置权限的那个栏目所使用的列表页模板,模板文件名通常类似于
list_article.htm、list_product.htm等,点击右侧的【修改】按钮。 -
在模板文件中添加PHP判断代码 在
list_*.htm文件的开头,在<!DOCTYPE html>之前,或者{dede:include filename="head.htm" /}这行代码之前,添加以下代码:
(图片来源网络,侵删){dede:php} // 判断用户是否登录 if($cfg_ml->IsLogin() == false) { // 如果未登录,则跳转到登录页面 // $cfg_cmspath 是网站根目录,确保跳转路径正确 // '&gotopage='.urlencode($cfg_phpurl."/list.php?tid=".$this->TypeID) 这部分代码可以让用户登录后自动跳转回当前栏目 $loginUrl = $cfg_cmspath."/member/index.php?uid={$cfg_ml->M_ID}&gotopage=".urlencode($cfg_phpurl."/list.php?tid=".$this->TypeID); echo "<script language='javascript'>location.href='".$loginUrl."';</script>"; exit(); } {/dede:php} -
保存并更新 点击模板编辑器右上角的【保存】按钮。
-
生成栏目HTML 去【栏目】->【更新栏目HTML】或【一键更新网站】,重新生成这个栏目的静态页面,这样,所有访问该栏目列表页的未登录用户都会被强制跳转到登录页面。
修改核心PHP文件(功能更全面)
这种方法通过修改处理栏目列表请求的核心PHP文件,来实现更严格的控制,它可以同时控制列表页和内容页的访问权限。
优点:

- 控制更全面,可以同时保护列表页和内容页。
- 逻辑更清晰,与模板分离。
缺点:
- 修改了核心文件,升级DedeCMS后需要重新修改。
- 如果修改错误,可能会导致网站无法正常运行。
操作步骤:
-
找到并打开核心文件 使用FTP或文件管理器,登录你的网站服务器,找到并下载
/include/arc.listview.class.php文件,这个文件是DedeCMS处理所有栏目列表页面的核心类文件。 -
在文件中添加权限判断代码 用代码编辑器(如VS Code, Sublime Text, Notepad++)打开
arc.listview.class.php文件。 找到ParseTempletsFirst()函数,这个函数在解析模板最开始时被调用,我们就在这个函数的开头添加权限判断代码。在
function ParseTempletsFirst()函数内部,第一行require_once(DEDEINC."/dedetemplate.class.php");的后面,添加如下PHP代码:// ----------------- 添加开始:登录才能浏览栏目 ----------------- // 引入会员类 require_once(DEDEINC.'/memberlogin.class.php'); $ml = new MemberLogin(); // 判断用户是否登录 if($ml->M_ID <= 0) { // 如果未登录,获取当前栏目ID $tid = (isset($this->TypeID) && is_numeric($this->TypeID)) ? $this->TypeID : 0; // 构建登录后跳转的URL,登录后自动回到当前栏目 $gourl = $GLOBALS['cfg_phpurl'].'/member/index.php?gotopage='.urlencode($GLOBALS['cfg_phpurl'].'/list.php?tid='.$tid); // 使用系统自带的提示函数,并跳转 ShowMsg('您尚未登录,请先登录!', $gourl, 0, 2000); exit(); } // ----------------- 添加结束 -----------------代码解释:
require_once(DEDEINC.'/memberlogin.class.php');:引入会员登录类。$ml = new MemberLogin();:实例化一个登录对象。$ml->M_ID <= 0:这是判断用户是否登录的关键,如果用户未登录,M_ID的值会是0或小于0。$tid = ...:获取当前正在访问的栏目ID,以便登录后能跳转回来。$gourl = ...:构建一个登录URL,并包含gotopage参数,告诉登录页面成功后该跳转到哪里。ShowMsg(...):这是DedeCMS内置的一个提示和跳转函数,它会显示一个提示框,并在指定时间后跳转。exit();:执行跳转后,立即终止脚本执行,防止页面继续加载。
-
保存文件并上传 保存修改后的
arc.listview.class.php文件,并通过FTP上传回服务器的原位置,覆盖旧文件。 -
更新缓存 登录DedeCMS后台,进入【系统】->【系统基本参数】->【性能选项】,点击【更新系统缓存】。
注意: 这种方法只保护了列表页,如果你想同时保护内容页(article_*.htm),你需要用类似的方法去修改 /include/arc.archives.class.php 文件,在它的 ParseTempletsFirst() 函数里也加上相同的权限判断代码。
总结与建议
| 特性 | 方法一 (模板标签) | 方法二 (修改核心文件) |
|---|---|---|
| 实现难度 | 简单 | 中等 |
| 维护性 | 高(升级无忧) | 低(需重新修改) |
| 控制范围 | 仅列表页 | 列表页 + 内容页(需额外修改) |
| 推荐度 | ★★★★★ (对大多数场景足够) | ★★★☆☆ (需要更全面控制时使用) |
给你的建议:
- 如果你只是想让普通用户在访问某个栏目列表时被要求登录,而内容页可以公开(或者你通过其他方式保护内容页),强烈推荐使用方法一,它最安全、最方便。
- 如果你希望整个栏目(包括列表和所有文章内容)都对未登录用户完全隐藏,那么可以考虑使用方法二,但请务必小心操作,并记得备份文件。
额外提示:使用DedeCMS的“栏目权限”功能
DedeCMS本身也带有一个简单的“会员才能访问”的栏目权限设置,但它功能比较基础,通常用于指定会员组才能访问,而不是“所有登录用户”。
路径: 【栏目】->【栏目管理】-> 选择一个栏目 -> 【修改】-> 【高级选项】->【浏览权限】
你可以在这里设置“仅指定会员组可见”,然后去【会员】->【会员管理】->【会员组管理】中,创建一个“普通会员”组,并将所有注册用户都归入这个组,这样也能实现类似效果,但不如上述两种方法直接和灵活。
选择最适合你需求的方法即可。
