Server : Apache
System : Linux iZ2vcgyutqttsd1p850kl8Z 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64
User : www ( 1000)
PHP Version : 5.6.40
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Directory :  /www/wwwroot/saimikebio.com/mobile/include/kernel/library/
Upload File :
Current Directory [ Writeable ] Root Directory [ Writeable ]


Current File : /www/wwwroot/saimikebio.com/mobile/include/kernel/library/Auth.class.php
<?php



// +----------------------------------------------------------------------

// | EcTouch [ 专注移动电商: 商创网络科技 ]

// +----------------------------------------------------------------------

// | Copyright (c) 2014 http://ectouch.cn All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: EcTouch Team <zhong@ecmoban.com> (QQ: 2880175560)

// +----------------------------------------------------------------------



//权限认证类

class Auth {



    static public $model = NULL; //数据库模型

    static public $config;



    static public function init($config = array()) {

        if (!isset($_SESSION))

            session_start();

        //登录地址

        self::$config['AUTH_LOGIN_URL'] = isset($config['AUTH_LOGIN_URL']) ? $config['AUTH_LOGIN_URL'] : __APP__ . '?a=login';

        //不需要认证的模块,对后台认证有效

        self::$config['AUTH_LOGIN_NO'] = isset($config['AUTH_LOGIN_NO']) ? $config['AUTH_LOGIN_NO'] : array('index' => array('login', 'verify'), 'common' => '*');

        //session前缀

        self::$config['AUTH_SESSION_PREFIX'] = isset($config['AUTH_SESSION_PREFIX']) ? $config['AUTH_SESSION_PREFIX'] : 'auth_';

        //是否缓存权限信息,如果设置为false,每次都需要从数据库读取数据

        self::$config['AUTH_POWER_CACHE'] = isset($config['AUTH_POWER_CACHE']) ? $config['AUTH_POWER_CACHE'] : false;

        //数据库表和字段映射	

        self::$config['AUTH_TABLE'] = isset($config['AUTH_TABLE']) ? $config['AUTH_TABLE'] : array(

            'group' => array(

                'name' => 'group',

                'field' => array('id' => 'id', 'power' => 'power_value'),

            ),

            'resource' => array(

                'name' => 'resource',

                'field' => array('id' => 'id', 'pid' => 'pid', 'operate' => 'operate'),

            ),

        );

    }



    //设置认证用户组id

    static public function set($groupid) {

        $_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'groupid'] = $groupid;

    }



    //清空认证

    static public function clear() {

        unset($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'groupid']);

        unset($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'power']);

    }



    //检测用户是否登录

    static public function checkLogin() {

        if (isset($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'groupid']) && !empty($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'groupid']))

            return true;

        else

            return false;

    }



    //权限认证检查

    static public function check($model, $config = array()) {

        self::$model = $model;

        self::init($config);

        $module = $_GET['_module']; //获取当前执行的模块

        $action = $_GET['_action']; //获取当前执行的操作	

        //print_r($_SESSION);

        //不需要认证的模块,则放行

        if (isset(self::$config['AUTH_LOGIN_NO'][$module]) && ((self::$config['AUTH_LOGIN_NO'][$module] == '*') || in_array($action, self::$config['AUTH_LOGIN_NO'][$module]))) {

            return true;

        }

        //没有登录,跳转到登录页面

        if (false == self::checkLogin()) {

            self::noLogin();

        }



        $power = self::getGroupPower($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'groupid']);



        if (($power == -1) || ($power[$module][$action] == -1)) {

            return true; //认证通过

        } else {

            self::noPower();

        }

    }



    //检查模块和操作权限

    static public function checkPower($module, $action = NULL) {

        if (empty($module))

            return false;

        $power = self::getGroupPower($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'groupid']);

        if (empty($power))

            return false;

        if ($power == -1)

            return true;



        if (empty($action) && isset($power[$module]) && !empty($power[$module])) {

            return true;

        } else if (isset($power[$module][$action])) {

            return true;

        } else {

            return false;

        }

    }



    //没有登录的时候调用

    static public function noLogin() {

        header('location:' . self::$config['AUTH_LOGIN_URL']);

        exit;

    }



    //没有权限的时候调用

    static public function noPower() {

        throw new Exception('您没有权限操作');

    }



    //自动获取模块信息

    static public function getModule($model, $config = array(), $module_path = '', $module_suffix = '') {

        self::$model = $model;

        self::init($config);

        //完成数据库表名和字段名映射	

        $table_group = self::$config['AUTH_TABLE']['group']['name']; //用户组表

        $table_resource = self::$config['AUTH_TABLE']['resource']['name']; //资源表



        $group_field_id = self::$config['AUTH_TABLE']['group']['field']['id']; //用户组表 id字段

        $group_field_power = self::$config['AUTH_TABLE']['group']['field']['power']; //用户组表 权限power字段



        $resource_field_id = self::$config['AUTH_TABLE']['resource']['field']['id']; //资源表 id字段

        $resource_field_pid = self::$config['AUTH_TABLE']['resource']['field']['pid']; //资源表 pid字段

        $resource_field_operate = self::$config['AUTH_TABLE']['resource']['field']['operate']; //资源表 operate字段

        //如果没有用户组和资源数据表,则自动创建

        $sql_group = "CREATE TABLE IF NOT EXISTS `" . self::$model->pre . $table_group . "` (

  `{$group_field_id}` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,

  `name` varchar(255) NOT NULL,

  `{$group_field_power}` varchar(1000) NOT NULL,

  `sort` int(10) unsigned NOT NULL,

  `status` int(1) unsigned NOT NULL,

  PRIMARY KEY (`{$group_field_id}`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";



        $sql_resource = "CREATE TABLE IF NOT EXISTS `" . self::$model->pre . $table_resource . "` (

  `{$resource_field_id}` int(10) unsigned NOT NULL auto_increment,

  `{$resource_field_pid}` int(10) unsigned NOT NULL,

  `{$resource_field_operate}` varchar(255) NOT NULL,

  `name` varchar(255) NOT NULL,

  `menu` int(1) unsigned NOT NULL,

  `sort` int(10) unsigned NOT NULL,

  `status` int(1) unsigned NOT NULL,

  PRIMARY KEY  (`{$resource_field_id}`),

  KEY `pid` (`{$resource_field_pid}`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";

        self::$model->query($sql_group);

        self::$model->query($sql_resource);



        $module_path = empty($module_path) ? './module/' : $module_path;

        $module_suffix = empty($module_suffix) ? 'Mod.class.php' : $module_suffix;

        $return_data = array();

        if ($dir = opendir($module_path)) {

            while ($filename = readdir($dir)) {

                if (!is_dir($filename)) {

                    $module_suffix_array = explode('.', $module_suffix, 2);

                    $module = str_replace($module_suffix, '', $filename);

                    $class_name = $module . $module_suffix_array[0];

                    $class_methods = get_class_methods($class_name);

                    if (is_array($class_methods)) {

                        foreach ($class_methods as $action) {

                            //过滤魔术方法

                            if (substr($action, 0, 2) != '__') {

                                $return_data[$module][$action] = -1;

                            }

                        }

                    }

                }

            }

            closedir($dir);

        }

        if (!empty($return_data)) {

            $data = array();

            foreach ($return_data as $key => $value) {

                $data[$resource_field_pid] = $condition[$resource_field_pid] = 0;

                $data[$resource_field_operate] = $condition[$resource_field_operate] = $key;



                $info = self::$model->table($table_resource)->where($condition)->find();

                if (empty($info)) {

                    $pid = self::$model->table($table_resource)->data($data)->insert();

                } else {

                    $pid = $info[$resource_field_id];

                }

                if (is_array($value)) {

                    foreach ($value as $key => $vo) {



                        $data[$resource_field_pid] = $condition[$resource_field_pid] = $pid;

                        $data[$resource_field_operate] = $condition[$resource_field_operate] = $key;



                        $info = self::$model->table($table_resource)->where($condition)->find();

                        if (empty($info)) {

                            self::$model->table($table_resource)->data($data)->insert();

                        }

                    }

                }

            }

        }

        return $return_data;

    }



    //获取用户组权限信息

    static public function getGroupPower($group_id = '') {



        //如果可以获取到权限值Session信息直接返回

        if (self::$config['AUTH_POWER_CACHE'] && !empty($_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'power']))

            return $_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'power'];



        //完成数据库表名和字段名映射	

        $table_group = self::$config['AUTH_TABLE']['group']['name']; //用户组表

        $table_resource = self::$config['AUTH_TABLE']['resource']['name']; //资源表



        $group_field_id = self::$config['AUTH_TABLE']['group']['field']['id']; //用户组表 id字段

        $group_field_power = self::$config['AUTH_TABLE']['group']['field']['power']; //用户组表 权限power字段



        $resource_field_id = self::$config['AUTH_TABLE']['resource']['field']['id']; //资源表 id字段

        $resource_field_pid = self::$config['AUTH_TABLE']['resource']['field']['pid']; //资源表 pid字段

        $resource_field_operate = self::$config['AUTH_TABLE']['resource']['field']['operate']; //资源表 operate字段

        //获取当前用户组信息	

        $condition = array();

        $condition[$group_field_id] = $group_id; //等价于$condition['id']=$group_id;

        $group = self::$model->table($table_group)->where($condition)->find();

        //用户组或用户组的权限值为空,则返回false

        if (empty($group) || empty($group[$group_field_power]))

            return false;



        //power_value=-1表示超级管理员,拥有所以权限

        if ($group[$group_field_power] == -1) {

            $power = -1;

        } else {

            //获取所有的资源信息	

            $resource = self::$model->table($table_resource)->select();

            //资源为空,则返回false

            if (empty($resource))

                return false;



            //权限值,分割成数组

            $power_value = explode(',', $group[$group_field_power]);

            $power = $resource2 = array();



            //将资源数组的下标转成id

            foreach ($resource as $vo) {

                $resource2[$vo[$resource_field_id]] = $vo;

            }



            foreach ($resource2 as $vo) {

                //筛选该用户组拥有的权限信息

                if ($vo[$resource_field_pid] != 0 && in_array($vo[$resource_field_id], $power_value)) {

                    $module = $resource2[$vo[$resource_field_pid]][$resource_field_operate]; //模块

                    $action = $vo[$resource_field_operate]; //操作方法

                    $power[$module][$action] = -1;

                }

            }

        }

        $_SESSION[self::$config['AUTH_SESSION_PREFIX'] . 'power'] = $power; //设置session

        return $power; //返回权限值

    }



}



?>