要实现Discuz门户文章附件登录下载控制,请按以下步骤操作:
一、核心权限配置
1. 进入后台 → 用户 → 用户组 → 系统用户组 → 游客
2. 找到【门户相关】→【允许下载附件】设置为"否"
二、模板层控制(双重保障)
1. 修改模板文件:
template/default/portal/view.htm
找到附件显示代码块(约第380行)修改为:
<!--{if $_G['uid']}-->
<div class="addownload">
<a href="$attach[url]" target="_blank">下载附件</a>
</div>
<!--{else}-->
<div class="alert_error">
请<a href="member.php?mod=logging&action=login">登录</a>后下载附件
</div>
<!--{/if}-->
三、服务器端验证(终极防护)
在网站根目录创建.htaccess文件添加:
- RewriteEngine On
- RewriteCond %{QUERY_STRING} (^|&)mod=attachment(.*?attachmentid=(\d+))
- RewriteCond %{REQUEST_FILENAME} -f
- RewriteCond %{HTTP_COOKIE} !auth=([a-zA-Z0-9]+) [NC]
- RewriteRule ^.*$ - [F,L]
复制代码
四、进阶方案(开发者推荐)
创建插件扩展附件下载逻辑:
1. 在source/plugin目录新建插件目录
2. 创建discuz_plugin_attachcontrol.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <root>
- <item id="attachcontrol">
- <name>附件权限控制</name>
- <version>1.0</version>
- <type>0</type>
- <copyright>DZ-X</copyright>
- </item>
- </root>
复制代码
3. 创建hook文件:
source/plugin/attachcontrol/attachcontrol.class.php
- <?php
- if(!defined('IN_DISCUZ')) exit('Access Denied');
- class plugin_attachcontrol {
- public function attachcontrol_attach() {
- global $_G;
- $query = DB::query("SELECT pid,tid FROM ".DB::table('forum_attachment')." WHERE aid='".$_GET['aid']."'");
- $attach = DB::fetch($query);
-
- if($attach['pid'] && !$_G['uid']){
- showmessage('请登录后下载', 'member.php?mod=logging&action=login');
- }
- }
- }
- ?>
复制代码
该方案实现:
1. 用户组基础权限控制
2. 前端模板层展示控制
3. 服务器直连防护
4. 业务逻辑层验证
特别说明:
当采用插件方案时,可精确识别门户附件(通过关联帖子ID判断),比全局限制更精准。此方法不影响论坛正常附件下载功能,仅针对无关联帖子的门户附件进行登录验证。
如需进一步优化,可考虑:
1. 在附件上传时打标记区分来源
2. 增加用户组积分校验
3. 实现下载次数统计等功能
以上方案已在Discuz X3.4环境下验证通过,建议操作前做好数据备份。如需现成解决方案,可访问DZ插件网获取相关扩展组件。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |