【问题标题】:PHP Role System - Logic Problems [closed]PHP角色系统-逻辑问题[关闭]
【发布时间】:2018-07-10 18:24:20
【问题描述】:

我正在开发一个小项目,我想实现一个基于页面用户访问的“高级”角色系统。 我在处理这个方案背后的逻辑时遇到了一些麻烦,因为我希望能够添加和删除角色和权限,我想用这种方式来做。希望您能与我分享您的建议。

我的 users 表在用户名、密码等字段旁边,它包含一个 userlevel 字段。

我打算创建以下方案:

角色表:

id - AI -> is referenced with **userlevel** field in users table
name - Role Name 
description - Role Description Description

页表:

id - AI
page_link -> saves the link of the page
description

权限表:

id - AI
role_id -> referenced with **id** in roles table
page_id -> referenced with **id** in pages table

所以我的想法是:

应该以某种方式保护的每个页面:

  1. 从 users 表中读取 userlevel
  2. 搜索该角色是否存在于 roles 表中;
  3. 如果没有,拒绝访问,如果存在,则根据用户权限为 role_id 创建一个 page_id 数组;
  4. 根据表权限中的每个 page_id 为表页面中的 pages_link 创建一个数组;
  5. 读取URL,如果数组中的页面链接,允许访问,如果不是,拒绝访问;

我的链接如下: /添加用户 /remove-user/user_id

如果我授予页面 /remove-user 的权限,用户可以删除用户吗? (基本访问/remove-user/user_id

我这样想对吗?我在创建这样的系统时感到非常困惑。 我真的很想访问页面和功能(例如,应该允许版主禁止用户但不能删除它 - 如果这些功能在同一页面上,我该如何实现?)。除此之外,我还需要另一个表用于“功能”,允许用户这样做或不这样做并以这种方式创建代码?

例如表userfunctions

id
role_id
permission

如果这个表中有权限edit_users,那么在渲染页面时,如果在数组“feature”中,是否显示按钮?

您能这样指导我吗? 没有这样的理论有更快的方法吗? 我可以很容易地做这个代码,我只是对这样的方案背后的逻辑过程感到困惑。

谢谢

【问题讨论】:

  • 这是一个相当广泛的问题,可能不太适合 SO,它主要专注于解决某人遇到的特定问题。如果您已经构建了这样一个系统并且从中得到错误或意外行为,那么这可能会引起一些反应。我的建议是研究内置此类功能的流行框架,这样您就不会重新发明轮子。身份验证和授权不是轻而易举的任务。
  • 感谢您的回答。通常我不使用框架。我喜欢自己做。假设我有自己的项目微框架。由于这是一个合乎逻辑的问题,我认为这可能适合这里。这不是代码的问题,而是逻辑方式的问题。感谢您的宝贵时间。

标签: php mysql roles


【解决方案1】:

我个人的做法:

  1. 检查页面是否公开(不限于任何用户),如果是,则停止。
  2. 检查用户是否登录,如果没有重定向到登录页面。
  3. 检查用户的级别是否足以查看页面,如果没有重定向到他们的主页。

我通常通过在每一页的顶部设置一个功能来完成上述所有操作:

<?php
require('system_loader.php');
check_access(ACCESS_LEVEL_ADMIN);

在我的配置文件中,我定义了一组当前角色:

define('ACCESS_LEVEL_SUPERADMIN',1);
define('ACCESS_LEVEL_ADMIN',2);
define('ACCESS_LEVEL_MODERATOR',5);
define('ACCESS_LEVEL_USER',10);
define('ACCESS_LEVEL_PUBLIC',100);

然后,我可以在每个页面的顶部定义查看它所需的访问级别。

所以,函数的伪代码是:

function check_access($level_required) {
 if ($level_required= ACCESS_LEVEL_PUBLIC) return;
 if (user_session_is_not_valid) redirect to login
 if (user_level < $level_required) redirect to user account page
}

这是一个基本系统,但它让您不必担心逻辑,只要您在管理用户会话方面做好一切准备。它依赖于一个滑动的权限范围,因此最高的值将始终拥有最多的权限,而最低的将只有公共权限。

请注意,将角色硬编码到系统中与您建议在数据库中设置角色不同。可以应用相同的逻辑,但您需要检查数据库中的角色。


我还应该指出,您提出的系统也可以正常工作。它会更复杂,并且会在个别功能等方面给予更大的控制。

在我的示例中,您可以简单地限制使用条件编码,检查是否应允许用户执行特定功能。

如果您希望拥有不适合滑动访问级别的角色,那么您确实必须维护一个参考表,将访问级别与特定页面或功能联系起来。

【讨论】:

  • 是的,和我的逻辑类似,但是使用数据库是完全动态的。谢谢!
  • 我只是添加了一点,但是是的,您提出的解决方案会很好用。你的逻辑是正确的。
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多