BASIC通过PHP脚本进行身份验证

时间:2014-02-19 04:52:56

标签: php apache

我是这个特定主题的新手。我花了半天时间搜索。我不能再忍受了,所以这里......

我正在开发一个允许用户将音频文件上传到服务器的网站。我将这些文件保存在http文档中的文件夹中。用户可以使用jPlayer收听他们上传的音频文件。

我已经使用Apache BASIC身份验证保护了我保存歌曲的文件夹,以防止公众直接访问网址。但是一旦用户登录我们的网络应用程序(使用我们的应用程序的登录机制),我希望该用户可以访问歌曲文件夹,以便他可以播放他的歌曲(最好是在他的会话期间)。

任何线索都将受到赞赏。感谢。

编辑:只是一个补充说明,基本身份验证将来自不在歌曲文件夹中的php文件。

1 个答案:

答案 0 :(得分:0)

过去对我有用的一个解决方案是使用PHP脚本为人们提供对文件的访问权限。我们称之为download.php。他们需要通过download.php访问文件,并将文件名作为$_GET参数发送,而不是让登录用户直接访问文件的实际位置,如:

的download.php?文件= some_awesome_song.mp3

通过这种方式,您可以控制诸如剩余下载次数,是否需要在下载之前等待一定时间(如某些网站上的下载倒计时),以防止他们访问其他用户的文件,等

您也可以忘记HTTP身份验证并使用.htaccess完全拒绝访问下载所在的目录:

deny from all

或将文件存储在Web根目录之外。

在PHP中执行以下操作:

<?php

session_start();

// Make sure user is logged in
if (isset($_SESSION['user_id'])) {
    die("You are not logged in");
}

// Make sure user has access to download the file
// Replace with your own methods if applicable
if ($_SESSION['user_has_permission_to_download_file'] === false) {
    die("You don't have permission to access that file");
}

// Make sure we're not trying to open anything outside of that directory
$filename = basename($_GET['file']);
// Replace with the actual location
$path = '/actual/path/to/file/' . $filename;

if (!file_exists($path)) {
    die("The requested file does not exist");
}

if (!is_readable($path)) {
    die("Permission denied while trying to open file");
}

$contents = file_get_contents($path);

// Set content type header based on file
header("Content-type: ".finfo_file($path));

echo $contents;