| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | <?php// +---------------------------------------------------------------------// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]// +---------------------------------------------------------------------// | Copyright (c) 2013-2014 http://www.thinkcmf.com All rights reserved.// +---------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +---------------------------------------------------------------------// | Author: Dean <zxxjjforever@163.com>// +---------------------------------------------------------------------namespace cmf\lib;use huo\model\user\UserModel;use huolib\constant\CommonConst;use think\Db;/** * ThinkCMF权限认证类 */class Auth {    //默认配置    protected $_config = [];    public function __construct() {    }    /**     * 检查权限     *     * @param $name     string|array  需要验证的规则列表,支持逗号分隔的权限规则或索引数组     * @param $uid      int           认证用户的id     * @param $relation string    如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证     *     * @return boolean           通过验证返回true;失败返回false     */    public function check($uid, $name, $relation = 'or') {        if (empty($uid)) {            return false;        }        if ($uid == 1) {            return true;        }        if (is_string($name)) {            $name = strtolower($name);            if (strpos($name, ',') !== false) {                $name = explode(',', $name);            } else {                $findAuthRuleCount = Db::name('auth_rule')->where(                    [                        'name' => $name                    ]                )->count();                if ($findAuthRuleCount == 0) {//没有规则时,不验证!                    return true;                }                $name = [$name];            }        }        $list = []; //保存验证通过的规则名//        $groups = Db::name('RoleUser')//                    ->alias("a")//                    ->join('__ROLE__ r', 'a.role_id = r.id')//                    ->where(["a.user_id" => $uid, "r.status" => CommonConst::STATUS_YES])//                    ->column("role_id");        $_map['id'] = $uid;        $_map['user_status'] = CommonConst::STATUS_YES;        $groups = (new UserModel())->where($_map)->column('role_id');        if (in_array(1, $groups)) {            return true;        }        if (empty($groups)) {            return false;        }        $rules = Db::name('AuthAccess')                   ->alias("a")                   ->join('__AUTH_RULE__ b ', ' a.rule_name = b.name')                   ->where(["a.role_id" => ["in", $groups], "b.name" => ["in", $name]])                   ->select();        foreach ($rules as $rule) {            if (!empty($rule['condition'])) { //根据condition进行验证                $user = $this->getUserInfo($uid);//获取用户信息,一维数组                $command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);                //dump($command);//debug                @(eval('$condition=('.$command.');'));                if ($condition) {                    $list[] = strtolower($rule['name']);                }            } else {                $list[] = strtolower($rule['name']);            }        }        if ($relation == 'or' and !empty($list)) {            return true;        }        $diff = array_diff($name, $list);        if ($relation == 'and' and empty($diff)) {            return true;        }        return false;    }    /**     * 获得用户资料     *     * @param $uid     *     * @return mixed     */    private function getUserInfo($uid) {        static $userInfo = [];        if (!isset($userInfo[$uid])) {            $userInfo[$uid] = Db::name('user')->where(['id' => $uid])->find();        }        return $userInfo[$uid];    }}
 |