Php 仅允许特定用户查看页面

Php 仅允许特定用户查看页面,php,security,session,authorization,Php,Security,Session,Authorization,所以我正在构建一个身份验证系统,允许客户端查看我们为他们创建的工作。每个客户只有一个账户。我试图找出一种方法来检查每个页面上登录的人是否被允许查看上述内容 基本上,文件结构是这样的:Client/Year/Project/然后在项目文件夹中有用于特定类别(flash、登录页等)的文件夹。每个文件夹中都有一个index.php文件,用于显示目录或项目。我需要在每个索引页面上检查登录的用户是否有权查看该页面 目前,我有几个会话变量: $\u会话['loggedin']-只是一个bool,在登录时设置

所以我正在构建一个身份验证系统,允许客户端查看我们为他们创建的工作。每个客户只有一个账户。我试图找出一种方法来检查每个页面上登录的人是否被允许查看上述内容

基本上,文件结构是这样的:Client/Year/Project/然后在项目文件夹中有用于特定类别(flash、登录页等)的文件夹。每个文件夹中都有一个index.php文件,用于显示目录或项目。我需要在每个索引页面上检查登录的用户是否有权查看该页面

目前,我有几个会话变量:

$\u会话['loggedin']-只是一个bool,在登录时设置为true

$\u Session['client']-此值在用户登录时从数据库中获取。它只是一个客户机全名字符串(也用于显示目的)

到目前为止,我在每一页上检查loggedin是否设置为true,并在每一页上硬编码:

if(!isset($_SESSION['loggedin']) || $_SESSION['client'] != 'Clientname'){
   unset($_SESSION);
   session_destroy();
   header("Location: http://www.homepage.com");
}
不过,我对这个解决方案不太满意,因为我正试图使它尽可能自动化——新的客户将继续添加,人们应该可以不太麻烦地添加客户(目前所有这些都很好,除了这一点)

我必须检查以确保客户端是正确的,因为以下情况可能会发生:客户端A登录,loggedin会话设置为true…但是,如果他们导航到客户端B的文件夹结构,它只检查是否有人登录,他们将能够访问它

有没有处理这种事情的好方法?我想实现一些可以在所有用户中使用的东西,而不需要在每次添加新客户机时都输入代码并更改客户机名称字符串


任何合乎逻辑的帮助都会很棒

您可以将客户机数据存储在公共可见目录结构之外的目录中,并使用mod_rewrite(如果您使用Apache)将所有请求重定向到单个index.php,其中将启动FrontController。此控制器根据请求字符串和会话cookie初始化身份验证和授权过程

如果您的文档根是
/some/folder/public\u html
,则客户端数据将存储在
/some/folder/data/client/…
中,PHP将发布特定文件夹的内容。您还可以将项目及其数据库密钥存储为文件夹。然后您不需要
Client/Year/Project/
的目录结构,而是
some/folder/data/{Project\u key}/..
。使用此解决方案,目录导航更简单

以下是该想法的一些简短摘录:

.htaccess 使用mod_重写重定向请求

RewriteEngine On
RewriteBase /path/to/client/data
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [QSA, L]
index.php 此脚本将初始化数据库连接、控制器和会话,并处理请求

// initialization of database connection    
$connection = ...

// controller initialziation
$controller = new FrontController($connection, ...);

// you could encapsulate the session in its own class to make
// easy requests to the session.
$session = new Session(...);

// select the requested resource by its path
$resource = $controller->selectResourceByPath($_GET['request']);

// resouce was not found
if (!$resource) {
    $controller->showNotFound($_GET['request']);
    exit(0);
}

// validate if the session is started. If not, redirect to the login page.
if (!$session->isStarted()) {
  $controller->redirect('login');
  exit(0);
}

$user = $session->getUser();

// user is not logged in
if (!$user) {
   $controller->redirect('login');
   exit(0);
}

// this is a very simple solution. You could build up separate
// authentication/authorization layer.
if ($resource->hasAccess($user))
  $controller->showResource($resource);
else
  $controller->showAccessDenied($user, $resource);

通常,您将使用路由器、防火墙类和ACL来保护实体的访问。此外,请求处理将在路由器->解析器->控制器链中结构化。这只是想法的摘录。

看起来您已经有了一个身份验证系统,因为您正在设置$current\u client=$\u SESSION['client']

您还可以说在每个客户机目录中都有一个index.php文件

您将文件夹与客户端一起放置在根目录下。我假设路径是:

/root/path/to/files/$$CLIENT$$$/

您只需将当前路径/to/client与$current\u client进行比较

// returns true if $str begins with $sub
function beginsWith( $str, $sub ) {
    return ( substr( $str, 0, strlen( $sub ) ) == $sub );
}

$authorized = beginsWith(__FILE__, '/root/path/to/files/' . $current_client) ;
将其添加到您的授权中,而不是硬编码客户端名称

if(!isset($_SESSION['loggedin']) || !$authorized){
   unset($_SESSION);
   session_destroy();
   header("Location: http://www.homepage.com");
}