Php 如何在网站中组织群组?(管理员、管理员权限、用户标识)

Php 如何在网站中组织群组?(管理员、管理员权限、用户标识),php,mysql,admin,administration,mysql-management,Php,Mysql,Admin,Administration,Mysql Management,我将要做一个小用户系统,但我有问题 如果我要创建一个注册表(mysql),只将密码和用户名存储到数据库中而不加密有什么错 我正在考虑如何构建管理部分。我是否应该检查数据库中的一列,看看用户是否是管理员?如果为true,则将显示管理页面 对于管理权限,假设我有3个权限:删除用户、批准用户和移动用户。在一些情况下,我可能只想让某些人能够批准、删除、全部或任意组合。我该怎么做?我在考虑为每一个电源设置一个专栏,并让脚本检查每一个专栏。让我们假设我有超过20个将被添加的异能 如果我有一个网站,人们可以创

我将要做一个小用户系统,但我有问题

  • 如果我要创建一个注册表(mysql),只将密码和用户名存储到数据库中而不加密有什么错

  • 我正在考虑如何构建管理部分。我是否应该检查数据库中的一列,看看用户是否是管理员?如果为true,则将显示管理页面

  • 对于管理权限,假设我有3个权限:删除用户、批准用户和移动用户。在一些情况下,我可能只想让某些人能够批准、删除、全部或任意组合。我该怎么做?我在考虑为每一个电源设置一个专栏,并让脚本检查每一个专栏。让我们假设我有超过20个将被添加的异能

  • 如果我有一个网站,人们可以创建组并成为他们组的管理员,这些管理员可以给他们组中的人不同的管理权限组合(例如,Zack创建了一个名为Mountain的组,并授予一名成员批准新组成员的权限,授予第二名成员删除成员的权限,并授予第三名成员删除和批准的权限。我将如何在MySQL中构建此功能?我是否应该使用列来说明他们管理的是哪个组以及他们使用的是什么权限有?例如列:删除、批准、GroupMemberOf、GroupAdminOf和使用检查

  • 我有一个想法,但我想学习更复杂的方法

    感谢您迄今为止的回答,然而,我确实在寻找关于结构的想法(问题2-4)。如果我能帮助澄清问题,请告诉我

  • 如果你不加密地存储密码,当有人试图窃取你的数据库或获得对它的读取权限时,你将泄露你客户的所有密码。不幸的是,大多数人在站点之间重复使用用户名和密码,因此你不保护用户的密码,这对用户是一个很大的不利影响。(也许他们应该更清楚,但大多数人不知道。)
  • 2.是的

    3.如果您有有限的权限,那么这很简单

    prm_user_id  | prm_permission
       0         | Admin
       0         | Delete
       1         | Add
    

    4.我几年前写过这篇文章,它在一家大公司被大量使用。如果你想了解更多关于该模式的信息,请与我联系。

    1-我建议你为每个用户使用唯一的salt加密密码。这样,如果你的系统被压缩,你的用户密码就不会被黑客使用(他们没有更多的黑客攻击)

    (有点老,但有一些好信息)

    2、3、4—所有这些都可以通过各种web语言实现。我建议您首先阅读数据库设计,找出哪种规范化和表模式最适合您的情况。如果您决定在将来为管理员用户添加更多权限,您可以从一开始就进行设计,避免任何错误在未来和现在的需求范围内

  • 为每个用户使用唯一的salt对用户密码进行哈希,以便当外部人员可以访问您的数据库时,他们无法解密密码,salt会降低
  • 2-4.使用一个表来表示访问级别(1:成员,2:版主(批准),3:管理员),并使用另一个不同的表来表示用户权限,其中存储多对多连接,如下所示:

    id (auto_increment)|usr_id|role_id|group_id
    -------------------------------------------
    1                  |1     |3      |-1
    2                  |2     |2      |1
    3                  |2     |3      |2
    4                  |3     |1      |2
    
    class BaseController extends Controller
    {
        protected $authorization;
        public function __construct()
        {
            $this->authorization = new Authorization();
        }
    
        public function render()
        {
            if ($this->authorization->authorized === true)
            {
                parent::render
            }
            else
            {
                // redirect to not authorized page 
            }
        }
    }
    
    INSERT INTO group_user_permissions
        SELECT `group_user`.`groupid`, `group_user`.`userid`, `permission`.`permbit`
            FROM permission, `group_user`
        WHERE `group_user`.`groupid` = 1
            AND `group_user`.`userid` = 1
    
    if( $permbit === "approve" )
    
    在您的情况下,用户1是整个站点的管理员,用户2是组3的管理员,组2的版主,用户3是组2的成员

    [编辑:

    关于限制不同角色的权限的更多想法:根据您的设置,您应该在每页的基础上使用一些角色强制,例如在MVC框架中,我将扩展基本控制器以要求为每个方法调用(角色)授权函数,否则它应该抛出异常。方法(页面)不需要用户登录的用户可以使用虚拟授权

    所以authorization类看起来像

    class Authorization
    {
        public $authorized = false;
    
        public function dummy()
        {
            $this->authorized = true;
        }
    
        public function member($usr_id, $group_id = null)
        {
            $sql = "SELECT usr_id FROM usr_roles WHERE usr_id = " . $usr_id . ($group_id !== null) ? " AND group_id " . $group_id : "";
            // count the results of $sql query
            // or some more stuff
            if ($results > 1)
            {
                $this->authorized = true;
            }
            else
            {
                $this->authorized = false;
            } 
        }
    
        // the other functions
    }
    
    新的基本控制器类将如下所示:

    id (auto_increment)|usr_id|role_id|group_id
    -------------------------------------------
    1                  |1     |3      |-1
    2                  |2     |2      |1
    3                  |2     |3      |2
    4                  |3     |1      |2
    
    class BaseController extends Controller
    {
        protected $authorization;
        public function __construct()
        {
            $this->authorization = new Authorization();
        }
    
        public function render()
        {
            if ($this->authorization->authorized === true)
            {
                parent::render
            }
            else
            {
                // redirect to not authorized page 
            }
        }
    }
    
    INSERT INTO group_user_permissions
        SELECT `group_user`.`groupid`, `group_user`.`userid`, `permission`.`permbit`
            FROM permission, `group_user`
        WHERE `group_user`.`groupid` = 1
            AND `group_user`.`userid` = 1
    
    if( $permbit === "approve" )
    
    最后,您的控制器将看起来像:

    class IndexController extends BaseController
    {
        // some stuff, methods etc.
    
        // methods needs logged in user and user must be a member. 
        public function index()
        {
            $this->authorization->member($session_user->getId());
        }
    }
    
    [EDIT2:

    如果您不熟悉OOP,则可以执行以下操作:

    以下是角色表的示例布局:

    role_id|role_name
    -----------------
    1      |member
    2      |moderator
    3      |admin
    
    然后,可以使函数authorize()包含在所有文件中:

    // role_name = "member", "moderator", "admin"
    function authorize($usr_id = null, $role_name = null, group_id = null)
    {
        // test for user in group and role, return boolean
    
    }
    
    在文件中包含此函数并执行以下操作

    if (authorize($usr_id, "moderator", 2)
    {
        // show stuff, if user with $usr_id is moderator for group 2
    }
    else
    {
        // do something else
    }
    // stuff for all 
    
    1)存储明文密码意味着,如果有人访问了您的数据库,他们仍然不知道密码。关于加密密码的炒作非常愚蠢,一个简单的方法对任何人都可以

    $password = "Mypassword";
    $salt = "a unique and constant string";
    $password = md5($password.$salt);
    
    这样做的目的是通过
    md5();
    对密码进行加密,在使用md5()对密码进行加密后,您无法将其取回。对其进行加密还可以确保无法仅找到密码

    如果要比较并查看密码是否有效,只需按如下完全相同的方式输入md5即可:

    $password = "check_this_password";
    if(md5($password.$salt) === $originalPassword) 
    { 
        //same password
    }
    
    2)这个问题取决于您希望如何将组与管理端集成。如果根本没有其他权限设置,则只在数据库中存储一个具有帐户级别的字段是安全的。否则,请使用我的下一点来确定他们是否是管理员

    3)实现权限系统的最简单方法如下,还有其他方法,但最好不要使其复杂化。如果您想要每个组的权限,您可以添加一个额外的列,如
    prm\u group\u id
    ,并找出特定组中每个用户的权限。但无论如何,它的工作原理如下:

    创建一个表来保存权限

    prm_user_id  | prm_permission
       0         | Admin
       0         | Delete
       1         | Add
    
    每行都有一个标志或权限。 然后,通过一点SQL和PHP就可以很简单地确定他们是否拥有所需的权限

    function hasPermission($permission, $userID)
    {
      $permissions = array();
    
      $sql = "SELECT prm_permission FROM user_permissions WHERE prm_user_id = $userID";
      $query = mysql_query($sql);
    
      while($data = mysql_fetch_array($query))
      {
         $permissions[] = $data['prm_permission'];
      }
    
      //Check if they have a permission with this:
      if(in_array($permission, $permissions))
      {
         return true;
      }
    return false;
    }
    
    这允许您添加和删除权限