PHP权限系统

权限系统

一个系统存在N个模块,我们称之为F(1),F(2),F(3),…,F(N),每个模块存在读权限和写权限。
若现在系统用户表设计如下:


-----------------------------------------------------------------------
 | id     | username  | password  | type  | write |  desc |  email |
-----------------------------------------------------------------------
  1001      tomyuan      xxxxxx      0       null    null    null

我们假设现在存在3个模块分别称之为N1,N2,N3,然后存在“读”和“写”权限,该怎么更改这个数据表让其支持权限系统呢?
方法很多

  • 方法1 权限json化
  • 新增字段permissions表示权限,类别varchar(255)
    {“N1”:[0, 0], “N2”:[1, 0], “N3”:[1, 1]} 这样表示tomyuan对于N1模块没有读和写的权限,对于N2模块有读的权限,对于N3模块有读和写权限即可。

  • 方法2 进制判断法
  • 我们根据权限类别数量的平方作进制数,而模块类别作为位数。则上述问题可以转化成生成一个3位的4进制数,数据表中存放一个字段permissions表示权限,类别int(10)即可,1表示没有读和写权限,2表示只有读权限,3表示只有写权限,4表示有读和写权限,该字段是124表示和上面的json表示的结果一样。

    PHP中的解决方案

  • 方法1 权限json化
  • 
    $user_data = User::find()->where(
        ["username" => $username, "password" => $password]
    )->one();
    $user_exist = User::find()->where(
        ["username" => $username]
    )->one();
    if (isset($user_data)) {
        // 检测权限 (无论是那种方法都这样)
        $permissions = $user_data["permissions"];
        $session->set('permissions', $permissions);
        ....
    }
    // 权限判断
    function getWritablePermissions() {
    
        $session = \Yii::$app->session;
        if ($session->isActive) {
            // Error
            $session->open();
        }
    
        return $session->get("permissions");
    }
    //
    $permissions = $this->getWritablePermissions();
    $permissions_arr = json_decode($permissions, true);
    if ($permissions_arr) {
        if (!isset($permissions_arr[$this->_modId]) || $permissions_arr[$this->_modId][0] == 0) 
        {
            // 没有读权限
            echo "< script >window.location.href='/';< /script >";
            return FALSE;
        }
    }  
    
  • 方法2 进制判断法
  • 这里和json唯一的区别就是解析权限,json的方法我们使用json_encode和json_decode就可以进行分析,进制这里我们使用取余的方法即可。

    $Permissions = [
    	"没有读写权限",
    	"读权限",
    	"写权限",
    	"读写权限"
    ];
    $permission_number = 1234;
    $n = $permission_number;
    $index = 4;
    while ($n > 0) {
    	$e = $n % 10;
    	$n = floor($n / 10);
    	echo "第" . $index . "模块有" . $Permissions[$e - 1] . "\n";
    	$index = $index - 1;
    }
    

    运行结果如下所示:

    欢迎留言

    avatar
      Subscribe  
    Notify of