權限檢查 check
* * * * *
~~~
/**
* 檢查權限
* @param $name string|array 需要驗證的規則列表,支持逗號分隔的權限規則或索引數組
* @param $uid int 認證用戶的id
* @param int $type 認證類型
* @param string $mode 執行check的模式
* @param string $relation 如果為 'or' 表示滿足任一條規則即通過驗證;如果為 'and'則表示需滿足所有規則才能通過驗證
* @return bool 通過驗證返回true;失敗返回false
*/
public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or')
{
if (!$this->config['auth_on']) {
return true;
}
// 獲取用戶需要驗證的所有有效規則列表
$authList = $this->getAuthList($uid, $type);
if (is_string($name)) {
$name = strtolower($name);
if (strpos($name, ',') !== false) {
$name = explode(',', $name);
} else {
$name = [$name];
}
}
$list = []; //保存驗證通過的規則名
$REQUEST = []; //保存驗證通過的規則名
if ('url' == $mode) {
$REQUEST = unserialize(strtolower(serialize(request()->param())));
}
foreach ($authList as $auth) {
$query = preg_replace('/^.+\?/U', '', $auth);
if ('url' == $mode && $query != $auth) {
parse_str($query, $param); //解析規則中的param
$intersect = array_intersect_assoc($REQUEST, $param);
$auth = preg_replace('/\?.*$/U', '', $auth);
if (in_array($auth, $name) && $intersect == $param) {
//如果節點相符且url參數滿足
$list[] = $auth;
}
} else {
if (in_array($auth, $name)) {
$list[] = $auth;
}
}
}
if ('or' == $relation && !empty($list)) {
return true;
}
$diff = array_diff($name, $list);
if ('and' == $relation && empty($diff)) {
return true;
}
return false;
}
~~~