PHP角色系统 - 逻辑问题

时间:2018-01-31 15:22:49

标签: php mysql roles

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

我的用户表位于用户名,密码等字段旁边,它包含 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. 搜索该角色是否存在于角色表中;
  3. 如果没有,请拒绝访问权限(如果存在),为用户权限 role_id 创建 page_id 数组;
  4. 根据表格权限中的每个 page_id ,从表格页面为 pages_link 创建数组;
  5. 读取数组中的URL和if page链接,允许访问,如果没有,则拒绝访问;
  6. 我的链接如下: /添加用户 /删除用户/的 USER_ID

    如果我授予page / remove-user权限,用户是否可以删除用户? (基本上可以访问/ remove-user / user_id

    我认为这是正确的方法吗?我在创建这样的系统时感到非常困惑。 我真的想要访问页面和功能(例如,应该允许moderador禁止用户但不删除它 - 如果这些功能在同一页面上,我该如何实现呢?)。除此之外,我需要另一张桌子用于"功能"允许用户这样做与否,并以这种方式创建代码?

    例如表 userfunctions

    id
    role_id
    permission
    

    如果在此表中有权限edit_users,那么在渲染页面时,如果在数组"功能",显示与否按钮?

    请你以这种方式指导我吗? 没有这样的理论,有更快的方法吗? 我可以轻松地执行此代码,我只是在这样的方案背后的逻辑过程中感到困惑。

    由于

1 个答案:

答案 0 :(得分:1)

我的个人方法:

  1. 检查页面是否公开(不限于任何用户),如果是,请停止。
  2. 检查用户是否已登录,如果没有重定向到登录页面。
  3. 检查用户的级别是否足以查看该页面,如果没有重定向到他们的主页。
  4. 我通常通过在每个页面的顶部放置一个函数来完成上述所有操作:

    <?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
    }
    

    这是一个基本系统,但它可以让您免于担心逻辑,只要您在管理用户会话方面掌握了一切。它依赖于权限的滑动比例,因此最高值将始终具有最多权限,而最低值将仅具有公共权限。

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

    我还应该注意到你提出的系统也可以正常工作。它会更复杂,并且可以在个人职能等方面给予更大的控制。

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

    如果您希望角色不适合滑动访问规模,那么您确实必须维护一个参考表,将访问级别与特定页面或函数相关联。